• Publicidad

Una pregunta sobre MySql y Arreglos

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Una pregunta sobre MySql y Arreglos

Notapor caribesoft » 2006-09-18 13:46 @615

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 8)
caribesoft
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2006-05-09 22:01 @959
Ubicación: Cancun

Publicidad

Notapor kidd » 2006-09-18 14:30 @646

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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @servicios_hotel = (
                                   'Activity Desk/Program',
                                   'Airport Transfers',
                                   'Babysitting Service',
                                   'Bars',
                                   'Beach',
                                   'Beach Lounges'
                                  );
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



Ahora, cuando hagas la seleccion de tu query, hazlo con un hash ref:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $entry = $sth->fetchrow_hashref();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y finalmente podrías hacer algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    for my $field(@servicios_hotel){
         print "$field: " . $entry->{$field}, "\n";
    }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Es más o menos el camino que debes de seguir, ya a ti te toca llenar lo que falta :wink:



Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

No son los nombres de los campos

Notapor caribesoft » 2006-09-18 16:41 @737

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: Seleccionar todo
for my $field(@servicios_hotel){
         print "$field: " . $entry->{$field}, "\n";
    }


como le harias para obtener esa seleccion ?

De antemano, muchas gracias,

Caribesoft
caribesoft
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2006-05-09 22:01 @959
Ubicación: Cancun

Notapor explorer » 2006-09-18 17:03 @752

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,
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@campos = split(',', $campo);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
tendremos ahora todos los valores, en un array.

Sólo queda crear los dos arrays por separado
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@servicios  = @campos[0 .. 23];
@amenidades = @campos[24 .. $#campos];
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

(Espero no haberme equivocado al contar el número de campos :-))
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

EL numero de respuestas cambian

Notapor caribesoft » 2006-09-18 17:28 @769

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 :


Imagen

y solo el campo que marcan, se guarda su nombre en un campo de la tabla .

Gracias por tu ayuda,

Caribesoft
caribesoft
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2006-05-09 22:01 @959
Ubicación: Cancun

Notapor explorer » 2006-09-18 18:02 @793

Bueno, pues entonces podemos hacerlo un poco más largo así (se puede hacer más corto, pero más oscuro):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    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 }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2006-09-18 18:03 @794

Atención, que veo que 'Air Conditioning ' tiene un espacio en blanco demás.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2006-09-18 18:27 @810

Esta es otra solución. Es igual de larga pero con otra idea...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    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 }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2006-09-18 18:33 @815

Y esta es la versión 'con trampa':
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# $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 , $_;
  }

}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La 'trampa' está en que todas las amenidades empiezan por 'In-Room...' :-)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor kidd » 2006-09-18 18:44 @822

Hola:

Leí nuevamente tu primer post y ví que lo que buscas es realmente sencillo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Siguiente

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron