Lun Sep 18, 2006 12:46 pm
|
 |
caribesoft
Perlero Nuevo

|
Registrado: 09 May 2006
Mensajes: 73
Ubicación: Cancun
|
|
| Una pregunta sobre MySql y Arreglos |
|
|
Buenas trades expertos Perlianos :
Necesito extraer datos de una tabla de MySql que no vienen clasificados, para poder procesarlos por separados pero no le doy al clavo todavia, una ayudadita seria bienvendida.
Este es el panorama :
En el llenado de un formulario, existen dos secciones (Servicios del Hotel y Amenidades de la habitacion), desgraciadamente la persona que diseño la aplicacion (en PHP) nunca penso que se deberian de manejar por separado y envia "Todos" los datos al campo de una tabla MySql, la cual se ve de esta forma:
Activity Desk/Program,Airport Transfers,Babysitting Service,Bars,Beach,Beach Lounges,Beach/Pool Towel Service,Children Welcome,Children,Concierge Service,Currency Exchange,Dry Cleaning Service,Fishing,Fitness/Exercise Facilities,Front Desk 24/7,Air Conditioning ,Balcony or Terrace,Cable or Satellite TV,Cribs Available,Daily Complimentary Newspaper,Daily Housekeeping,Electronic/Magnetic Keys,Extra Bedding Available,Handheld Shower,In-Room Bottled Water,In-Room Coffee/Tea Maker,In-Room DVD,In-Room Hair Dryer,In-Room Iron & Ironing Board
Los primeros campos y hasta "Handheld Shower" (en este ejemplo), corresponden a Servicios del Hotel, los siguientes hasta el ultimo a "Amenidades de la Habitacion".
Lo que deseo hacer, es separarlos en dos arreglos diferentes para posteriormenete mostrarlos en un sitio web , en sus secciones correspondientes (Hotel y Habitacion), pero "El Problema" es que, debido a que vienen de un formulario en el que se seleccionnan las carateristicas de cada "Seccion", no siempre empiezan y/o terminan con los mismos campos.
Pense en crear primeramente un solo Arreglo e ir depurandolo haciendo la comparacion con una lista de "Servicios del Hotel" y luego con otra de "Amenidades del Hotel", pero no estoy seguro que esta sea la mejor forma ......
Alguna mejor idea, mis expertos amigos ?
Saludos,
Caribesoft  |
|
|
|

Lun Sep 18, 2006 1:30 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
|
|
|
|
|
Hola:
Es muy sencillo lo que quieres, yo lo te te podría recomendar es que hagas un par de arreglos con los nombres de campo que corresponden a cada sección, por ejemplo:
| Perl: | my @servicios_hotel = (
'Activity Desk/Program',
'Airport Transfers',
'Babysitting Service',
'Bars',
'Beach',
'Beach Lounges'
); |
Ahora, cuando hagas la seleccion de tu query, hazlo con un hash ref:
| Perl: | my $entry = $sth->fetchrow_hashref(); |
Y finalmente podrías hacer algo así:
| Perl: | for my $field(@servicios_hotel){
print "$field: " . $entry-> {$field}, "\n";
} |
Es más o menos el camino que debes de seguir, ya a ti te toca llenar lo que falta
Saludos |
|

Lun Sep 18, 2006 3:41 pm
|
 |
caribesoft
Perlero Nuevo

|
Registrado: 09 May 2006
Mensajes: 73
Ubicación: Cancun
|
|
| No son los nombres de los campos |
|
|
Hola Kidd :
Gracias por tu pronta ayuda, pero creo que no me supe explicar bien, los datos (valores) vienen en un solo campo de la tabla, es decir :
Activity Desk/Program,Airport Transfers,Babysitting Service,Bars,Beach,Beach Lounges
No son nombres de los campos, sino que son los "datos" seleccionados en el formulario. Estan dentro de un solo campo de la tabla, separados con comas.
Hice la prueba de lo que me recomiendas, pero el resultado que obtengo del query, es exactamente igual al contenido del arreglo (@servicios_hotel), y yo quisiera que solo los "datos" que se hayan seleccionado se filtraran al momento de desplegar el query como lo indcias :
| Código: |
for my $field(@servicios_hotel){
print "$field: " . $entry->{$field}, "\n";
}
|
como le harias para obtener esa seleccion ?
De antemano, muchas gracias,
Caribesoft |
|

Lun Sep 18, 2006 4:03 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4212
Ubicación: Valladolid, España
|
|
|
|
|
Supongamos que, efectivamente, sea la coma el separador de los campos. Luego entonces, si $campo contiene el campo leído de la base de datos,
| Perl: | @campos = split(',', $campo); | tendremos ahora todos los valores, en un array.
Sólo queda crear los dos arrays por separado
| Perl: | @servicios = @campos[0 .. 23];
@amenidades = @campos[24 .. $#campos];
|
(Espero no haberme equivocado al contar el número de campos ) |
|

Lun Sep 18, 2006 4:28 pm
|
 |
caribesoft
Perlero Nuevo

|
Registrado: 09 May 2006
Mensajes: 73
Ubicación: Cancun
|
|
| EL numero de respuestas cambian |
|
|
Gracias Explorer:
Mas o menos es lo que habia pensando, pero el problema es que el numero de respuestas en cada seccion "Servicios" o "Amenidades", son variantes, ya que cada hotel tiene diferentes servicios y amenidades.
Este es un ejemplo del formulario :
y solo el campo que marcan, se guarda su nombre en un campo de la tabla .
Gracias por tu ayuda,
Caribesoft |
|

Lun Sep 18, 2006 5:02 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4212
Ubicación: Valladolid, España
|
|
|
|
|
Bueno, pues entonces podemos hacerlo un poco más largo así (se puede hacer más corto, pero más oscuro):
| Perl: | 1 #!/usr/bin/perl -l
2
3 @HOTEL_servicios = (
4 'Activity Desk/Program', 'Airport Transfers', 'Babysitting Service',
5 'Bars', 'Beach', 'Beach Lounges',
6 'Beach/Pool Towel Service', 'Children Welcome', 'Children',
7 'Concierge Service', 'Currency Exchange', 'Dry Cleaning Service',
8 'Fishing', 'Fitness/Exercise Facilities', 'Front Desk 24/7',
9 'Air Conditioning ', 'Balcony or Terrace', 'Cable or Satellite TV',
10 'Cribs Available', 'Daily Complimentary Newspaper', 'Daily Housekeeping',
11 'Electronic/Magnetic Keys', 'Extra Bedding Available', 'Handheld Shower',
12 );
13 @HOTEL_amenidades = (
14 'In-Room Bottled Water', 'In-Room Coffee/Tea Maker', 'In-Room DVD',
15 'In-Room Hair Dryer', 'In-Room Iron & Ironing Board',
16 );
17
18 # $entry lo leemos de la base de datos
19 $entry = $sth-> fetchrow_hashref();
20 %entry = ();
21 $entry{$_} = 1 foreach split(',', $entry);
22
23 @servicios = ();
24 @amenidades = ();
25 foreach $servicio ( @HOTEL_servicios ) {
26 push @servicios, $servicio if $entry{$servicio};
27 }
28 foreach $amenidad ( @HOTEL_amenidades ) {
29 push @servicios, $amenidad if $entry{$amenidad};
30 } |
Es más largo porque como no sabemos si algún campo existe o no, tenemos que hacer una búsqueda por todos ellos.
Aquí, inicializamos dos vectores a los nombres de los campos que nos interesa separar.
Luego leemos la entrada de la base de datos, la separamos por comas y vamos guardando cada campo en una memoria asociativa (línea 21). De esa forma, si el cliente elige 'Bars', existirá el elemento '$entry{Bars}'.
Luego, el trabajo consiste en mirar todos los campos y ver si existen o no en la entrada leída de la base de datos, guardando el resultado en un par de arrays. |
|

Lun Sep 18, 2006 5:03 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4212
Ubicación: Valladolid, España
|
|
|
|
|
| Atención, que veo que 'Air Conditioning ' tiene un espacio en blanco demás. |
|

Lun Sep 18, 2006 5:27 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4212
Ubicación: Valladolid, España
|
|
|
|
|
Esta es otra solución. Es igual de larga pero con otra idea...
| Perl: | 1 #!/usr/bin/perl -l
2
3 # Datos
4 @HOTEL_servicios = (
5 'Activity Desk/Program' ,
6 'Airport Transfers' ,
7 'Babysitting Service' ,
8 'Bars' ,
9 'Beach' ,
10 'Beach Lounges' ,
11 'Beach/Pool Towel Service' ,
12 'Children Welcome' ,
13 'Children' ,
14 'Concierge Service' ,
15 'Currency Exchange' ,
16 'Dry Cleaning Service' ,
17 'Fishing' ,
18 'Fitness/Exercise Facilities' ,
19 'Front Desk 24/7' ,
20 'Air Conditioning ' ,
21 'Balcony or Terrace' ,
22 'Cable or Satellite TV' ,
23 'Cribs Available' ,
24 'Daily Complimentary Newspaper' ,
25 'Daily Housekeeping' ,
26 'Electronic/Magnetic Keys' ,
27 'Extra Bedding Available' ,
28 'Handheld Shower' ,
29 );
30 @HOTEL_servicios { @HOTEL_servicios } = (1) x @HOTEL_servicios;
31
32 @HOTEL_amenidades = (
33 'In-Room Bottled Water' ,
34 'In-Room Coffee/Tea Maker' ,
35 'In-Room DVD' ,
36 'In-Room Hair Dryer' ,
37 'In-Room Iron & Ironing Board' ,
38 );
39 @HOTEL_amenidades{ @HOTEL_amenidades } = (1) x @HOTEL_amenidades;
40 # Fin datos
41
42 # $entry lo leemos de la base de datos
43 $entry = $sth-> fetchrow_hashref();
44
45 @servicios = ()
46 @amenidades = ();
47 foreach ( split(',', $entry) ) {
48 if ( $HOTEL_servicios{ $_ } ) {
49 push @servicios , $_;
50 }
51 else {
52 push @amenidades, $_;
53 }
54 } |
|
|

Lun Sep 18, 2006 5:33 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4212
Ubicación: Valladolid, España
|
|
|
|
|
Y esta es la versión 'con trampa':
| Perl: | # $entry lo leemos de la base de datos
$entry = $sth-> fetchrow_hashref();
@servicios = ()
@amenidades = ();
foreach ( split(',', $entry) ) {
if ( /^In-Room/ ) {
push @amenidades, $_;
}
else {
push @servicios , $_;
}
} |
La 'trampa' está en que todas las amenidades empiezan por 'In-Room...'  |
|

Lun Sep 18, 2006 5:44 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
|
|
|
|
|
Hola:
Leí nuevamente tu primer post y ví que lo que buscas es realmente sencillo.
| Perl: | #!/usr/bin/perl -w
use strict;
my @HOTEL_servicios = (
'Activity Desk/Program', 'Airport Transfers', 'Babysitting Service',
'Bars', 'Beach', 'Beach Lounges',
'Beach/Pool Towel Service', 'Children Welcome', 'Children',
'Concierge Service', 'Currency Exchange', 'Dry Cleaning Service',
'Fishing', 'Fitness/Exercise Facilities', 'Front Desk 24/7',
'Air Conditioning ', 'Balcony or Terrace', 'Cable or Satellite TV',
'Cribs Available', 'Daily Complimentary Newspaper', 'Daily Housekeeping',
'Electronic/Magnetic Keys', 'Extra Bedding Available', 'Handheld Shower',
);
my @HOTEL_amenidades = (
'In-Room Bottled Water', 'In-Room Coffee/Tea Maker', 'In-Room DVD',
'In-Room Hair Dryer', 'In-Room Iron & Ironing Board',
);
#Aquí pondrías el query para sacar el campo
#con los datos del formulario
my $sql = "Fishing,Balcony or Terrace,In-Room Iron & Ironing Board";
#Creamos nuestro hash con las entradas del campo
my %entry = map { $_, "1" } split(/\,/, $sql);
#IMPRIMIR LOS SERVICIOS DEL HOTEL
print "Servicios del Hotel\n";
print map { "\t$_\n" if $entry{$_} } @HOTEL_servicios;
#IMPRIMIR LAS AMENIDADES
print "Amenidades de la Habitación\n";
print map { "\t$_\n" if $entry{$_} } @HOTEL_amenidades; |
Saludos |
|

Mie Sep 20, 2006 11:09 am
|
 |
caribesoft
Perlero Nuevo

|
Registrado: 09 May 2006
Mensajes: 73
Ubicación: Cancun
|
|
| Excelente, las dos funcionan |
|
|
Muchas Gracias Explorer y Kidd :
Como dicen por alli, Siempre hay mas de una forma para resolver un problema, y en este caso los dos tips que me dieron fuincionan !!!.
No cabe duda que este es el mejor sitio de la red para aprender eficazmente PERL y ustedes son los mejores "Maestros" que existen.
Nuevamente felicidades por este sitio tan maravilloso que ha creado y mantiene actualizado el famoso Kidd ....
Saludos,
Caribesoft |
|
Lun Sep 25, 2006 4:41 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4212
Ubicación: Valladolid, España
|
|
|
|
|
PERL, no... Perl, si.  |
|
Lun Sep 25, 2006 4:52 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
|
|
|
|
|
| explorer escribió: | PERL, no... Perl, si.  |
Buena esa,
Perl: Dícese del lenguaje de programación.
perl: Dícese del interprete.
PERL: ugh!
Saludos |
|
Lun Sep 25, 2006 5:17 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4212
Ubicación: Valladolid, España
|
|
|
|
|
| Es que la gente piensa que PERL es un acrónimo de algo, como el PHP y, aunque se han propuesto algunos, realmente es un nombre, como el de Python o Ruby. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|