Foros del Web » Programando para Internet » PHP »

Ayuda con listbox

Estas en el tema de Ayuda con listbox en el foro de PHP en Foros del Web. Buenas a todos... Soy muy nuevo en esto de PHP y talves esto ya tenga solución aquí pero en el buscador lo localice nada.. Tengo ...
  #1 (permalink)  
Antiguo 30/05/2003, 14:06
Avatar de BrujoNic
Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.803
Antigüedad: 16 años
Puntos: 609
Mensaje Ayuda con listbox

Buenas a todos... Soy muy nuevo en esto de PHP y talves esto ya tenga solución aquí pero en el buscador lo localice nada..

Tengo un formulario en el cual tengo 2 listbox donde dependiendo de la elección del primero, quiero que me genere una lista diferente para el segundo, ejemplo:

Listbox 1 (alimentos, bebidas) si por ejemplo se selecciona alimentos, quisiera que el Listbox 2 me muestre por ejemplo (arroz, carne, pan, etc). Pero si se elije bebidas, me salga en el Listbox 2 (agua, gaseosos, naturales, etc).

Por favor, si me pueden ayudar o darme un link para hacer esto, se los agradecere
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #2 (permalink)  
Antiguo 30/05/2003, 14:16
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

El termino de busqueda seria "listas dependientes". Y Ademas del buscador, deberias haber revisado las FAQs del foro: http://www.forosdelweb.com/showthrea...608#post327608 .

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 30/05/2003, 16:29
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
mm bueno .. el ejemplo que usa BD .. al fin y al cabo se resumen en un array (que es lo que entrega mysql_fecht_array() ... )

Estúdia el código .. Pero si quiers hacerlo con "Arrays" .. sería mejor que lo hicieras en Javascrip completamente y si quieres via PHP "cargas" esos arrays javascript .. (sería lo más lógico) ...

El "unico" secreto de las "listas dependientes" .. es que se usa un pco de javascript (para hacer la recarga de página ante un evento onChange() de la lista desplegable (list Box) "Padre" .. y se le pasa a la misma página el "ID" ó "indice de tu array" para generar la lista desplegable "hija" ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 30/05/2003, 17:19
Avatar de BrujoNic
Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.803
Antigüedad: 16 años
Puntos: 609
Bueno ya lo vi y tienen razón... yo quería ponerlo en arrays para saber el funcionamiento pero voy a seguir su consejo. Yo ya tengo algo parecido pero estático poniendo manualmente el nombre de la estructura que deseaba accesar, luego por que campo deseaba buscar, la condición (=, >, <, LIKE, etc) y el valor a buscar. Todo funcionaba ya que tenía 2 tablas gemelas de consulta pero con diferente información dependiendo del acceso. Ahora necesito hacer consultas similares pero con tablas con campos diferentes y viendo el ejemplo del link (el cual generé las tablas y vi su funcionamiento), voy a crear las mismas 2 tablas padre e hija para crear mi menú de selección de filtros.

Una última pregunta, hay alguna forma de controlar ese error que da cuando ingresa uno por primera ves a la página, ese que dice Undefined index: id_padre in?

Gracias a ambos
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #5 (permalink)  
Antiguo 30/05/2003, 17:36
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
SI, usando isset() ...


Código PHP:
// Obtener el $id_padre del envio a si mismo del formulario ..

if (isset($_POST['id_padre'])){
   
$id_padre=$_POST['id_padre'];


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 04/06/2003, 17:31
Avatar de BrujoNic
Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.803
Antigüedad: 16 años
Puntos: 609
Bueno, continúo aquí para darle seguimiento a lo mismo... Ya me trabajan las multilistas tal y como explica el ejemplo y la ayuda de ustedes. Ahora tengo otra consulta la cual espero me ayuden resolver.

El ejemplo funciona bien para 2 tablas (padre e hija) ya que al seleccionar el padre, automáticamente me selecciona los elementos en la hija pero... yo tengo 3 tablas la cual podemos llamar: abuelo, padre e hija. Cuando cambia abuelo, me cambia sin ningún problema el padre, pero la hija no ya que pierde el elemento del padre al actualizarse. Solo lo recupera cuando elijo un elemento del padre. ¿Cómo hago para que cuando cambie el abuelo y padre, recupere el primer elemento del padre para que la hija sepa que le corresponde?

Espero haber sido claro sino, ahi me dicen para exponerlo de otra forma.

Gracias
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #7 (permalink)  
Antiguo 04/06/2003, 17:51
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pues .. fijate en los ejemplos .. Ahí tienes bloques de "padre e hija" para hacer la consulta por el ID_xxx correspondiente .. adañe un tercer bloque que será el de tu "abuelo" ..

La tabal padre usa esta consulta:
Código PHP:
$SQLconsulta_padre="SELECT * FROM tabla_padre"
Si añades a tu "abuelo" .. la consulta tendría que usar el "condicional" WHRE .. con el id_abuelo

Código PHP:
$SQLconsulta_padre="SELECT * FROM tabla_padre WHERE id_abuelo='$id_abuelo'"
Si entendieste la técnica .. sólo tienes que pasar el ID de una tabla a la siguiente y así sucesivamente .. la primera consulta (de tu tabla abuelo en este caso .. será sin "condicional WHERE" .. y las siguiente serán bajo el ID seleccionado en la aterior) ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #8 (permalink)  
Antiguo 04/06/2003, 18:18
Avatar de BrujoNic
Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.803
Antigüedad: 16 años
Puntos: 609
Cluster los Select estan así:

Menú es el abuelo
Código PHP:
  // Formar Selec "abuelo".
  
echo "<select name='id_padre' onChange='this.form.submit()'>\n";
  echo 
"<option value='\'> Seleccione un Item </option>\n";

  
$SQLconsulta_menu="SELECT * FROM menu";
  
$consulta_menu mysql_query($SQLconsulta_menu,$conexion) or die(mysql_error()); 
Submenú es el padre
Código PHP:
  // Formar Select "padre"
  
echo "<select name='id_hijo' onChange='this.form.submit()'>\n";

  
// Si $id_padre no tiene valor (caso de que no se ha seleccionado ningua opcion del select hijo
  // se muestra el mensaje de "seleccine un item" (del select padre).
  
if (!empty($id_padre)){

    
$SQLconsulta_hijo="SELECT * FROM sub_menu WHERE id_padre='$id_padre'";
    
$consulta_hijo mysql_query($SQLconsulta_hijo,$conexion) or die(mysql_error()); 
Criterio es el hijo
Código PHP:
  // Formar Select Criterio
  
echo "<select name=criterio> onChange='this.form.submit()'>\n";
    
  if (!empty(
$id_hijo)){
    
$SQLconsulta_aux="SELECT * FROM sub_menu WHERE id='$id_hijo'";
    
$consulta_aux mysql_query($SQLconsulta_aux,$conexion) or die(mysql_error()); 
Del menú al submenú, no hay ningún problema... Pero cuando cambia del el submenú la primera ves y al tratar de ejecutar el criterio, no puede ya que no hay elementos seleccionados en el submenú y este se actualiza cuando selecciono algún elemento del submenú.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #9 (permalink)  
Antiguo 04/06/2003, 18:23
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
No te entiendo bien

Si pones el código completo que usas junto con la estructura y datos de ejemplo como para poder probarlo sería lo ideal ... (tal cual la FAQ que vistes ..)

mmm ahora creo que ya sé que ocurre ..

Parece que vas a tener que propagar el ID de las otras dos tablas en campos hidden en el formulario para que no se "pierdan" y sean propagados .. Eso sería la "idea" más o menos.


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 04/06/2003 a las 18:29
  #10 (permalink)  
Antiguo 04/06/2003, 19:26
Avatar de BrujoNic
Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.803
Antigüedad: 16 años
Puntos: 609
OK, va el código completo y la estructura de las tablas...

Tablas:
Código PHP:
#
# Estructura de tabla para la tabla `menu`
#

DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu` (
  `
idtinyint(3NOT NULL default '0',
  `
item_textovarchar(50NOT NULL default '',
  `
tablavarchar(50NOT NULL default '',
  
PRIMARY KEY  (`id`)
TYPE=MyISAM;

#
# Volcar la base de datos para la tabla `menu`
#

INSERT INTO `menu` (`id`, `item_texto`, `tabla`) VALUES
(1'Consulta Tabla1''tabla1'),
(
2'Consulta Tabla2''tabla2'),
(
3'Consulta Tabla3''tabla3');

#
# Estructura de tabla para la tabla `sub_menu`
#

DROP TABLE IF EXISTS `sub_menu`;
CREATE TABLE `sub_menu` (
  `
idtinyint(3NOT NULL default '0',
  `
id_padretinyint(3NOT NULL default '0',
  `
item_textovarchar(50NOT NULL default '',
  `
campovarchar(50NOT NULL default '',
  `
criteriotinyint(3) default NULL,
  
PRIMARY KEY  (`id`)
TYPE=MyISAM;

#
# Volcar la base de datos para la tabla `sub_menu`
#

INSERT INTO `sub_menu` (`id`, `id_padre`, `item_texto`, `campo`, `criterio`) VALUES
(11'Código''codigo'1),
(
21'Nombre''nombre'2),
(
32'Código''codigo'1),
(
42'Dirección''direccion'2),
(
53'Producto''producto'1),
(
63'Descripción''descripcion'2),
(
73'Existencia''existencia'1);

#
# Estructura de tabla para la tabla `criterio`
#

DROP TABLE IF EXISTS `criterio`;
CREATE TABLE `criterio` (
  `
idtinyint(3NOT NULL default '0',
  `
igualenum('N','S'NOT NULL default 'N',
  `
menorenum('N','S'NOT NULL default 'N',
  `
menor_igualenum('N','S'NOT NULL default 'N',
  `
mayorenum('N','S'NOT NULL default 'N',
  `
mayor_igualenum('N','S'NOT NULL default 'N',
  `
diferenteenum('N','S'NOT NULL default 'N',
  `
parecidoenum('N','S'NOT NULL default 'N',
  
PRIMARY KEY  (`id`)
TYPE=MyISAM;

#
# Volcar la base de datos para la tabla `criterio`
#

INSERT INTO `criterio` (`id`, `igual`, `menor`, `menor_igual`,
`
mayor`, `mayor_igual`, `diferente`, `parecido`) VALUES
(1'S''S''S''S''S''S''N'),
(
2'N''N''N''N''N''N''S'); 
Código:
Código PHP:
<?
// datos de conexion a la BD.
$servidor  ="localhost"// host
$usuario   ="root"
$clave     ="<la clave>";
$basedatos ="pruebas"// Indicar una Base de datos.

// si se ha pulsado el boton enviar ($enviado) se procesa el formulario ..
// Sino, se continua con el formulario y los nuevos valores de los Select ..
// OJO si se tienen mas varibles (mas <input> ) se van a perder sus valores a no ser
// que los obtengamos y se les de como valor inicial en el value= de cada uno segun corresponda.

// Obtener el $id_padre del envio a si mismo del formulario ..

if (isset($_POST['id_padre'])){
  
$id_padre=$_POST['id_padre'];
}

if (!empty(
$_POST['enviado'])){
  
resultado();

else {
  
// Conexión a la BD
  
$conexion mysql_connect($servidor$usuario$clave) or die(mysql_error());
  
mysql_select_db($basedatos$conexion) or die(mysql_error());
  
  
// Inicio Formulario .. PHP_SELF enviamos a si mismo (a este script).
  
echo "<form action=\"".$_SERVER['PHP_SELF']."\" method=\"POST\">\n\n";

  
// Formar Selec "Padre".
  
echo "<select name='id_padre' onChange='this.form.submit()'>\n";
  echo 
"<option value='\'> Consultar... </option>\n";

  
$SQLconsulta_menu="SELECT * FROM menu";
  
$consulta_menu mysql_query($SQLconsulta_menu,$conexion) or die(mysql_error());
  
  While  (
$registro_menu=mysql_fetch_assoc($consulta_menu)){
    
// Se mira si el ID del registro es el mismo q el $id_padre q recibimos si hemos cambiado el select hijo.
    // Se selecciona en consecuencia (selected) la opción elegida.
    
if ($id_padre == $registro_menu['id']){
      echo 
"<option value=".$registro_menu['id']." selected>".$registro_menu['item_texto']."</option>\n";
    }
    else {
      echo 
"<option value=".$registro_menu['id'].">".$registro_menu['item_texto']."</option>\n";
    }
  }
  echo 
"</select>\n\n";

  
mysql_free_result($consulta_menu); // Liberar memoria usada por consulta.

  // Formar Select "Hijo"
  
echo "<select name='id_hijo' onChange='this.form.submit()'>\n";

  
// Si $id_padre no tiene valor (caso de que no se ha seleccionado ningua opcion del select hijo
  // se muestra el mensaje de "seleccine un item" (del select padre).
  
if (!empty($id_padre)){

    
$SQLconsulta_hijo="SELECT * FROM sub_menu WHERE id_padre='$id_padre'";
    
$consulta_hijo mysql_query($SQLconsulta_hijo,$conexion) or die(mysql_error());
    
// se mira el total de registros de la consulta .. si es 0 se muestra mensaje en el select ..
    
if (mysql_num_rows($consulta_hijo) != 0){
      echo 
"<option value='\'> Sobre que campo? </option>\n";
      While  (
$registro_hijo=mysql_fetch_assoc($consulta_hijo)){
        if (
$id_hijo == $registro_hijo['id']){
          echo 
"<option value=".$registro_hijo['id']." selected>".$registro_hijo['item_texto']."</option>\n";
        }
        else {
          echo 
"<option value=".$registro_hijo['id'].">".$registro_hijo['item_texto']."</option>\n";
        }
      }
    }
    else {
      echo 
"<option value='\'> No hay tablas para consultar </option>";
    }
  }
  else {
    echo 
"<option value='\'> <-- Seleccione un Item  </option>";
  }

  
mysql_free_result($consulta_hijo); // Liberar memoria usada por consulta.
  
echo "</select>\n\n";

  
// Formar Select Criterio
  
echo "<select name=criterio> onChange='this.form.submit()'>\n";
    
  if (!empty(
$id_hijo)){
    
$SQLconsulta_aux="SELECT * FROM sub_menu WHERE id='$id_hijo'";
    
$consulta_aux mysql_query($SQLconsulta_aux,$conexion) or die(mysql_error());
    
$id_criterio mysql_fetch_array($consulta_aux);

    if (
mysql_num_rows($consulta_aux) != 0){
      
$SQLconsulta_criterio="SELECT * FROM criterio WHERE id=$id_criterio[4]";
      
$consulta_criterio mysql_query($SQLconsulta_criterio,$conexion) or die(mysql_error());

      while(
$registro_criterio=mysql_fetch_assoc($consulta_criterio)) {
        if (
$registro_criterio['igual'] == 'S') {
          echo 
"<option>=</option>\n";
        }
        if (
$registro_criterio['menor'] == 'S') {
          echo 
"<option><</option>\n";
        }
        if (
$registro_criterio['menor_igual'] == 'S') {
          echo 
"<option><=</option>\n";
        }
        if (
$registro_criterio['mayor'] == 'S') {
          echo 
"<option>=></option>\n";
        }
        if (
$registro_criterio['mayor_igual'] == 'S') {
          echo 
"<option>>=</option>\n";
        }
        if (
$registro_criterio['diferente'] == 'S') {
          echo 
"<option><></option>\n";
        }
        if (
$registro_criterio['parecido'] == 'S') {
          echo 
"<option>LIKE</option>\n";
        }
      }
      echo 
"</select>\n\n";
    }
  }
  else {
    echo 
"<option value='\'> <-- Seleccione un criterio  </option>";
  }
    
  
mysql_free_result($consulta_criterio); // Liberar memoria usada por consulta.
  
mysql_free_result($consulta_aux); // Liberar memoria usada por consulta.
    
  
echo "<input type=\"submit\" name=\"enviado\" value=\" Enviar \" >\n\n";
  echo 
"</form>\n";
}
function 
resultado(){

  
// Procesar el formulario ...
  
echo "Procesando formulario:<br>";
  echo 
"Consulta: ".$_POST['id_padre']."<br>";
  echo 
"Campo: ".$_POST['id_hijo']."<br>";
  echo 
"Criterio: ".$_POST['criterio'];
}
?>
Para resolver el problema que tengo actualmente, lo que hice es ponerle OBLIGATORIAMENTE al primer SELECT hijo, un OPTION VALUE nulo con la literal "Sobre que campo?" para obligar al usuario a seleccionar y se refresque el campo de criterio a usar.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #11 (permalink)  
Antiguo 04/06/2003, 21:28
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pues estube probando el código ..

A mi me parece correcto la solución que has dado. Osese .. las listas desplegables se generan las opciones según el valor seleccionado del <select> superior ..

Es decir .. Siguiendo un orden gerarquico

select_abuelo -> select_padre -> select_hijo ...

¿Que es exactamente lo que quieres hacer?.

(ahora que hay datos .. puedes poner ejemplo tipo:
selecciona tabla1 -> código -> = .. o lo que estimes oportuo ..)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #12 (permalink)  
Antiguo 05/06/2003, 10:04
Avatar de BrujoNic
Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.803
Antigüedad: 16 años
Puntos: 609
La solución que puse, se me ocurrio en el momento que me pediste que pusiera el código fuente y las tablas. Lo que pretendía es que cuando cambiara el menú y se cargara el submenú, quedara seleccionado el primer elemento para que cuando busque a cual criterio pertenece, lo cargue porque actualmente cuando cambia el submenú, solo genera la lista y no queda ningún elemento seleccionado.

Los datos de las tablas las cambie ya que la información original es un poco confusa. Lo acople en elementos sencillos.

Ahora voy a completarlo con un campo donde se va a digitar el valor de comparación para realizar los select a las tablas con el criterio deseado y muestre el resultado del mismo.

De todas formas, muchas gracias... poco a poco tratare de aprender más como funciona PHP.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL

Última edición por BrujoNic; 05/06/2003 a las 10:07
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:22.