Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Listas dependientes, reducir código innecesario!

Estas en el tema de Listas dependientes, reducir código innecesario! en el foro de PHP en Foros del Web. Estoy intentando hacer unas listas dependientes con PHP y MySQL . El script funciona. Es largo y feo, pero funciona ( He dejado a un ...
  #1 (permalink)  
Antiguo 09/03/2014, 18:23
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Listas dependientes, reducir código innecesario!

Estoy intentando hacer unas listas dependientes con PHP y MySQL. El script funciona. Es largo y feo, pero funciona (He dejado a un lado los scripts que me he encontrado en los buscadores, porque, por diversas razones, resultan complicados).

Tengo dos select's. El 1ro es para seleccionar el continente, y en el 2do aparecen los países según el continente elegido. Es todo.

Lo que quiero es reducir código, y en vez de poner 1,517 if's, pues sería bueno hacer una sola función para ello.

Éste sería el código que he tratado de reducir, aún sin frutos. Es el código que imprime los inputs en el 2do select:
Código PHP:
Ver original
  1. <select name="select2">
  2.       <option value="Ninguno">Elige un continente</option>
  3.       <?php
  4.         if ( $seleccion == 'America' )
  5.         {
  6.             while( $fila1 = mysql_fetch_array($datos1) )
  7.             {
  8.                 echo '<option value="">' . $fila1['pais'] . '</option>';
  9.             }
  10.         }      
  11.  
  12.         if ( $seleccion == 'Europa' )
  13.         {
  14.             while( $fila2 = mysql_fetch_array($datos2) )
  15.             {
  16.                 echo '<option value="">' . $fila2['pais'] . '</option>';
  17.             }
  18.         }      
  19.  
  20.         if ( $seleccion == 'Africa' )
  21.         {
  22.             while( $fila3 = mysql_fetch_array($datos3) )
  23.             {
  24.                 echo '<option value="">' . $fila3['pais'] . '</option>';
  25.             }
  26.         }      
  27.       ?>
  28.     </select>



Saludos!


PD. Para que se contextualicen, aquí le s dejo el código completo, download, del PHP que sí funciona, pero que quiero modificar. Nota: la base de datos se llama "proyecto1" y la tabla se llama "paises", la cual contiene 3 campos: "id", "pais" y "categoria". Esta última contiene como valor el nombre del continente del país.

Última edición por berkeleyPunk; 09/03/2014 a las 18:31
  #2 (permalink)  
Antiguo 09/03/2014, 18:35
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Listas dependientes, reducir código innecesario!

¿Necesitas una idea o quieres que alguien haga tu trabajo?

Nadie va a bajar un archivo sólo para entender lo que no eres capaz de explicar.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 09/03/2014, 18:36
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Listas dependientes, reducir código innecesario!

No lo he probado, pero si no funciona al menos te puedes hacer una idea.

Código PHP:
<?php
if($seleccion == 'America'){
    
$select $datos1;
}    
if(
$seleccion == 'Europa'){
    
$select $datos2;
}    
if(
$seleccion == 'Africa'){
    
$select $datos3;
}       
?>
<select name="select2">
    <option value="Ninguno">Elige un continente</option>
    <?php
        
while($fila mysql_fetch_array($select)) {
            echo 
'<option value="">' $fila['pais'] . '</option>';
        }
    
?>
</select>
Creo que el código aún se entiende a pesar de su reducción.

Un saludo
  #4 (permalink)  
Antiguo 09/03/2014, 18:44
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Sonrisa Respuesta: Listas dependientes, reducir código innecesario!

Cita:
Iniciado por pateketrueke Ver Mensaje
¿Necesitas una idea o quieres que alguien haga tu trabajo? Nadie va a bajar un archivo sólo para entender lo que no eres capaz de explicar.
Tienes toda la razón, maestro pateketrueke. Yo mismo me enojo cuando la gente postea sin poner aunque sea cómo ha intentado solucionar su problema, como esperando que otros hagan su trabajo. En lo particular, no puse mi intento, o una de mis tentativas de solución, porque el post se iba a hacer aún más largo, y pensé que a la gente le iba a dar mucha flojera. Pero créeme, no soy tan miserable como para pretender que la gente de Foros del Web haga el trabajo por mí, no, jamás!

He aquí mi intento, el cual tiene como resultado: nada. Es decir, no se imprime ni un input en el 2do select.

Código PHP:
Ver original
  1. <select name="select2">
  2.       <option value="Ninguno">Elige un continente</option>
  3.       <?php
  4.         if($seleccion == 'America') {$num_fila = '1'; $num_datos = '1';}
  5.         if($seleccion == 'Europa')  {$num_fila = '2'; $num_datos = '2';}
  6.         if($seleccion == 'Africa')  {$num_fila = '3'; $num_datos = '3';}
  7.  
  8.         $continente = $seleccion;
  9.         $fila      = '$fila'.$num_fila;
  10.         $datos     = '$datos'.$num_datos;
  11.  
  12.         while( $fila = mysql_fetch_array($datos) )
  13.         {
  14.             echo '<option value="">' . $fila['pais'] . '</option>';
  15.         }
  16.       ?>
  17.     </select>

Y de paso, pues pongo cómo están declaradas las variables:
Código PHP:
Ver original
  1. $consulta1 = 'SELECT * FROM paises WHERE categoria="America"';
  2.   $consulta2 = 'SELECT * FROM paises WHERE categoria="Europa"';
  3.   $consulta3 = 'SELECT * FROM paises WHERE categoria="Africa"';
  4.   $datos1    = mysql_query($consulta1);
  5.   $datos2    = mysql_query($consulta2);
  6.   $datos3    = mysql_query($consulta3);
  7.   $fila1     = mysql_fetch_array($datos1);
  8.   $fila2     = mysql_fetch_array($datos2);
  9.   $fila3     = mysql_fetch_array($datos3);
  10.  
  11.   $seleccion = $_POST['select1'];

Saludos!
  #5 (permalink)  
Antiguo 09/03/2014, 19:04
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Listas dependientes, reducir código innecesario!

Y mi respuesta pasa desapercibida

  #6 (permalink)  
Antiguo 09/03/2014, 20:01
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Listas dependientes, reducir código innecesario!

De entrada si haces esto ya vas mal:
Código PHP:
Ver original
  1. $consulta1 = 'SELECT * FROM paises WHERE categoria="America"';
  2.   $consulta2 = 'SELECT * FROM paises WHERE categoria="Europa"';
  3.   $consulta3 = 'SELECT * FROM paises WHERE categoria="Africa"';
  4.   $datos1    = mysql_query($consulta1);
  5.   $datos2    = mysql_query($consulta2);
  6.   $datos3    = mysql_query($consulta3);
  7.   $fila1     = mysql_fetch_array($datos1);
  8.   $fila2     = mysql_fetch_array($datos2);
  9.   $fila3     = mysql_fetch_array($datos3);

Si al final sólo usas un conjunto de resultados, ¿para que cargar en memoria los conjuntos restantes?

Es un desperdicio de recursos, está muy claro que desde ahí comienza el problema.

Una solución para dicho problema es abstraer en una función la generación de la consulta:
Código PHP:
Ver original
  1. function paises($de) {
  2.   $consulta1 = 'SELECT * FROM paises WHERE categoria="$de"';
  3.   $datos1    = mysql_query($consulta1);
  4.   $lista = array();
  5.  
  6.   while ($fila1     = mysql_fetch_array($datos1)) {
  7.     $lista []= $fila1;
  8.   }
  9.  
  10.   return $lista;
  11. }

Así, cuando necesites una lista en especifico no tienes que colocando if's para manejar cada uno.

Código PHP:
Ver original
  1. <?php foreach (paises($seleccion) as $pais) { ?>
  2.   <option><?php echo $pais->nombre; ?></option>
  3. <?php } ?>

¿Se entiende?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 09/03/2014, 20:14
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Respuesta: Listas dependientes, reducir código innecesario!

Cita:
Iniciado por Heli0s Ver Mensaje
No lo he probado, pero si no funciona al menos te puedes hacer una idea...
Buena noche, maestro Heli0s. No pasó desapercibida tu respuesta. Yo leo todo para sacar provecho de todo aquel quien se toma la molestia de leer un post. Sólo que le contesté de inmediato a pateketrueke porque en verdad no quiero pasar por un miserable...

Bueno, leí tu recomendación y al leerla, de inmediato dije: "No va a funcionar, porque no toma en cuenta las variables...". Pero después de releerla 3 veces, dije: "Pues creo que sí va a funcionar".

Hice la prueba con tu recomendación, y funcionó a la pura perfección!

Como no conozco un jsfiddle.net para PHP, y ojalá existiera, pues dejo aquí el código entero. Aunque antes de hacerlo, quizá me puedas ayudar con 2 problemas más que surgen con el código (que no impiden que se ejecute bien el resto).

1. En la base de datos hay 5 registros por continente, pero en pantalla sólo se muestran 4, ¿por qué?

2. Así como está el código, antes que nada sale este error: Undefined index: select1 (select1 es el name del combo 1). Sale el error porque todavía no se ha hecho submit, por tanto, no existe la variable $_POST['select1']. Según he visto los códigos en la web, para esto sirve el siguiente código:

Código PHP:
Ver original
  1. $requestMethod = $_SERVER["REQUEST_METHOD"];
  2.  
  3.   if ($requestMethod == "POST")
  4.   {
  5.      // y aquí se declaran las variables $_POST, para evitar el error, creo...
  6.      $seleccion = $_POST['select1'];
  7.   }

Al poner esto, desaparece el error marcado. Pero aparece otro: en cada option del select1, o sea, junto a cada nombre de continente, aparece el sig error:
Notice: Undefined variable: seleccion ($seleccion es la variable que guarda el option seleccionado)

Saludos!

Última edición por berkeleyPunk; 09/03/2014 a las 20:23
  #8 (permalink)  
Antiguo 10/03/2014, 06:29
Avatar de alexisverano  
Fecha de Ingreso: septiembre-2008
Ubicación: La Habana.Cuba
Mensajes: 298
Antigüedad: 15 años, 7 meses
Puntos: 36
Respuesta: Listas dependientes, reducir código innecesario!

Llegate por aqui:

Es un ejemplo de tres litas dependientes PHP, MySQL y AJAX

http://www.forosdelweb.com/f18/aport...veles-1090358/
  #9 (permalink)  
Antiguo 08/05/2014, 19:38
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
De acuerdo Respuesta: Listas dependientes, reducir código innecesario!

Cita:
Iniciado por alexisverano Ver Mensaje
Llegate por aqui...
Ahora sí que hasta pena me da por responder tan tarde.

Soy franco, cuando posteaste tu respuesta, alexisverano, intenté leer tu código y se me hizo ininteligible, era, sin duda, más de lo que yo pedía, mucho más. Y como en ese entonces no conocía nada de nada, pero nada en verdad de AJAX, pues soslayé tu respuesta. Mala cosa, porque uno debería responder al menos, para no quedar por un miserable.

Hoy en día sé un poquillo más de lo que sabía entonces, voy a darle una segunda revisión al código que propones y saludos!

Etiquetas: Ninguno
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 03:20.