Ver Mensaje Individual
  #10 (permalink)  
Antiguo 04/06/2003, 18:26
Avatar de BrujoNic
BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 22 años, 5 meses
Puntos: 655
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