Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Una pregunta sobre MySql y Arreglos

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Lun Sep 18, 2006 12:46 pm
caribesoft
Perlero Nuevo
Perlero Nuevo
Registrado: 09 May 2006
Mensajes: 73
Ubicación: Cancun
Una pregunta sobre MySql y Arreglos Responder citando

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 Cool
Mensaje Lun Sep 18, 2006 1:30 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

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 Wink



Saludos
Mensaje Lun Sep 18, 2006 3:41 pm
caribesoft
Perlero Nuevo
Perlero Nuevo
Registrado: 09 May 2006
Mensajes: 73
Ubicación: Cancun
No son los nombres de los campos Responder citando

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
Mensaje Lun Sep 18, 2006 4:03 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
Responder citando

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 Smile)
Mensaje Lun Sep 18, 2006 4:28 pm
caribesoft
Perlero Nuevo
Perlero Nuevo
Registrado: 09 May 2006
Mensajes: 73
Ubicación: Cancun
EL numero de respuestas cambian Responder citando

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
Mensaje Lun Sep 18, 2006 5:02 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Lun Sep 18, 2006 5:03 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
Responder citando

Atención, que veo que 'Air Conditioning ' tiene un espacio en blanco demás.
Mensaje Lun Sep 18, 2006 5:27 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
Responder citando

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 }
Mensaje Lun Sep 18, 2006 5:33 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
Responder citando

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...' Smile
Mensaje Lun Sep 18, 2006 5:44 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

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
Mensaje Mie Sep 20, 2006 11:09 am
caribesoft
Perlero Nuevo
Perlero Nuevo
Registrado: 09 May 2006
Mensajes: 73
Ubicación: Cancun
Excelente, las dos funcionan Responder citando

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
Mensaje Lun Sep 25, 2006 4:41 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
Responder citando

PERL, no... Perl, si. Smile
Mensaje Lun Sep 25, 2006 4:52 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

explorer escribió:
PERL, no... Perl, si. Smile


Buena esa, Wink


Perl: Dícese del lenguaje de programación.

perl: Dícese del interprete.

PERL: ugh!


Saludos
Mensaje Lun Sep 25, 2006 5:17 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
Responder citando

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.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group