Inicio > Listas desplegables, MySql, Php5 > Listas desplegables llenadas dinámicamente (tag select) 1er. Caso

Listas desplegables llenadas dinámicamente (tag select) 1er. Caso

jueves, 22 de mayo de 2008 Dejar un comentario Ir a comentarios

Luego de ver la parte introductoria de este tema, el primer caso es cargar la página en una primera oportunidad para luego de escoger un departamento, se cargue la página nuevamente y tener las provincias para ese departamento, empezaremos primero creando nuestras tablas en mysql (nombre de la base de datos es bd_anidados), este sería el script:

CREATE TABLE departamento (
coddep TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
desdep VARCHAR(30) NOT NULL,
PRIMARY KEY(coddep)
);

CREATE TABLE provincia (
codpro SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
despro VARCHAR(50) NOT NULL,
coddep TINYINT UNSIGNED NOT NULL,
PRIMARY KEY(codpro),
INDEX coddep(coddep)
);

Los datos lo llenan a su gusto…, primero llenen el departamento, registren los nombres, luego dependiendo del id que coloca el departamento llenan las provincias el nombre y a que departamento pertenece (coddep), al ser autoincrement ambas tablas le generá su id o identificador de tabla…, pueden tomar como referencia los datos de su localidad, estados, regiones, distritos, etc, uds vean.

El primer caso es cargar la página con la primera lista desplegable llena con los departamentos.

anidado1.php

< ?php // primer bloque php
if (isset($_POST['sDep']))
$coddep=$_POST['sDep'];
else
$coddep=-1;
?>
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<title>Select anidado 1</title>
</head>

<body>
<form name="f1" action="anidado1.php" method="post">
<b>Departamentos : Provincias</b><br />
<select name="sDep" onchange="javascript:f1.submit();">
<option value="-1">Seleccione</option>
< ?php // segundo bloque php
/* Conectamos a los datos */
$cn = mysql_connect("localhost","usuario","clave");
mysql_select_db("bd_anidados");
$sql="SELECT * FROM departamento";
$rs=mysql_query($sql);
while ($reg=mysql_fetch_assoc($rs)) { // departamentos
$cd=$reg['coddep']; // código departamento
$dd=$reg['desdep']; // descripción departamento
if ($coddep==$cd)
echo "<option value=$cd selected>$dd";
else
echo "<option value=$cd>$dd</option>";
}
?>
</select>
<select name="sPro">
< ?php // tercer bloque php
if ($coddep==-1) {
echo "<option value=-1>Escoge departamento";
}
else {
$sql="SELECT * FROM provincia WHERE coddep=$coddep";
$rs=mysql_query($sql);
while ($reg=mysql_fetch_assoc($rs)) { provincias
$cp=$reg['codpro']; // código provincia
$dp=$reg['despro']; // descripción provincia
echo "<option value=$cp>$dp</option>";
}
}
?>
</select>
</form>
</body>
</html>

Esta forma como les decía realiza doble carga de la página, y en caso tengamos más de un caso de listas deplegables en nuestra página como que vamos a demorar, a parte de que tendríamos que controlar cada carga de página, haría crecer nuestro código.

¿Cuál es la idea?, en la primera carga debemos tener la primera lista con los departamentos, en la segunda carga se llenará el segundo select con las provincias de acuerdo al departamento seleccionado y para evitar perder la descripción del departamento del primer select necesitamos ubicarlo y seleccionarlo.

Viendo esto es importante saber cuando es primera o segunda carga, para lo cual es necesario utilizar un flag o bandera con un valor que indique ello, utilizaremos para nuestro caso la variable PHP $_POST, que sólo aparece cuando se hace la segunda carga

Por pasos:

El primer bloque php creamos el flag o bandera en la variable $coddep, si es -1 es primera carga de lo contrario al tener un valor es la segunda carga.

En el segundo bloque php llenaremos la primera lista de acuerdo a los datos de la tabla departamento, la condición if nos sirve para no perder la descripción del departamento en la segunda carga.

El tercer y último bloque llena el segundo select, si es primera carga, sólo nos muestra un elemento con un mensaje, la segunda realiza la carga de las provincias de acuerdo al departamento seleccionado.

Lioso ¿no? hasta para explicar.

Hasta pronto para ver el próximo caso.

Ver demostración

Descarga el ejemplo de este post haciendo click en el siguiente botón

Descarga el script con 3 listas desplegables anidadas haciendo click en el siguiente botón

Categories: Listas desplegables, MySql, Php5 Tags: ,
  1. jazmin
    lunes, 30 de diciembre de 2013 a las 14:10 | #1

    ME SALVASTE LA VIDAA..!!!!

  2. antonio
    jueves, 20 de junio de 2013 a las 14:52 | #2

    @carian Hola carian, tienes varias formas de contactarme, muéstrame como va tu código y lo revisamos…. saludos

  3. martes, 18 de junio de 2013 a las 14:50 | #3

    hola antonio.. te hago una preg… mira probe este codigo, lo cual anda muy bien … pero tengo un problema a la hora de cargar se me borran los demas datos del formulario… he probado en cambiar las cosas, pero aun asi me sigue actualizado y borrando todo lo de mi formulario… espero tu respuesta.. gracias

  4. lunes, 21 de enero de 2013 a las 16:51 | #4

    necesito ayuda para hacer menus desplegables.
    gracias.

    • antonio
      lunes, 21 de enero de 2013 a las 21:05 | #5

      ¿qué problema tienes?, recuerda que los ejemplos son de listas desplegables mas no de menús desplegables

      Saludos y gracias por visitar mi blog

  5. antonio
    martes, 26 de junio de 2012 a las 19:00 | #6

    @angel
    Hola Angel, justamente este es el problema de las recargas de página, deberías revisar los otros ejemplos con AJAX y actualmente con jQuery, también puedes utilizar Javascript como arreglos fijos recién hice un video sobre este tema, suerte

  6. angel
    lunes, 25 de junio de 2012 a las 18:19 | #7

    Hola amigo buen día
    tu aporte me parece fabuloso, lo modifique un poco a mi base de datos con todos los países y todas sus provincias y estados y va de maravilla, solo que aprendiendo un poco del mismo php me falla lo siguiente tengo varios datos adicionales que meter pero al momento de llegar al país recarga los datos del formulario para poder colocar el estado o provincia según sea el caso y pues obvio me borra todos mis datos que puedo hacer para que no lo haga quiero pensar que lo dominas por que no borra el dato de país que en tu ejemplo seria el dato distrito
    Te agradezco tu atencion

  7. verous
    sábado, 31 de marzo de 2012 a las 16:32 | #8

    @admin
    mucha gracias Antonio anda de maravillas… no sabes como me salvaste… mil veces gracias…

  8. sábado, 17 de marzo de 2012 a las 16:10 | #9

    @verous
    Hola verous gracias por visitar mi blog acabo de adjuntar el script con 3 listas, en la última parte de este post para que lo descargues.

  9. verous
    sábado, 17 de marzo de 2012 a las 14:57 | #10

    hola estuve mirando tu codigo y la verdad que anda de maravilla, pero estoy con el mismo problema que jose necesito agregar otra lista con los districtos… y de acuerdo a lo que a el le explicaste no me sale… quisiera saber si puedes ponerlo mas completo asi veo como debo agregar la lista que me falta.
    lo que quiero son ´3 listas departamento, provincia y districto,… graciasssssssss

  10. domingo, 25 de diciembre de 2011 a las 21:10 | #11

    @jose
    José gracias por comentar… este código está un poco antiguo y como que sería agregar mucho código en todos los bloques.
    Primero, tendrías que agregar en el else del tercer bloque un option value=’-1′ para controlar la provincia en las recargas de la página
    Segundo, controlar en el primer bloque si tienes un value de provincia diferente de -1
    Tercero, repetir el tercer bloque pero en el SQL = «SELECT * FROM distrito WHERE codpro=$codpro»;
    En tu consulta SQL no necesitas colocar el código del departamento por la integridad referencial, que en mi ejemplo no he utilizado.

    Gracias nuevamente por comentar… FELIZ NAVIDAD!

  11. domingo, 25 de diciembre de 2011 a las 20:37 | #12

    Hola amigo lei tu aplicacion de lista y esta muy bueno tienes un 10 te queria consultar algo como hago yo si deseo mostrar los distritos de las provincias … osea en 3 combos departamento,provincias y distritos…el codigo que hice fue este no se si esta bien o no lo se…… por favor me puedes ayudar estare muy agradecido…

    <?php // cuarto bloque php
    if ($cp==$cd) {
    echo "Escoge distritos»;
    }
    else {
    $sqlr=»select * from distritos where coddep=$coddep and codpro=$cp»;
    $resul=mysql_query($sqlr);
    while($registros=mysql_fetch_assoc($resul)){
    $cd=$registros[‘coddis’];
    $desd=$registros[‘desdis’];
    echo «$desd»;
    }

    }

    ?>

  12. breatssnalact
    lunes, 24 de mayo de 2010 a las 01:12 | #13

    Thanks for making such a valuable blog, sincerely Kobos Mathers.

    Gucci Shoes

  13. Eduardo
    sábado, 21 de noviembre de 2009 a las 14:19 | #14

    Gracias por el aporte, esta buscando algo asi por la red.

  14. paolo machado
    lunes, 26 de octubre de 2009 a las 19:03 | #15

    Hola Antonio, gracias por tu super aporte.
    Pero tengo una duda creo que interesante.
    Que sucederia si todo ello esta en una sola tabla.
    Qué tanto cambiaria el algoritmo?

    Espero puedas ejemplificarlo como tan bien haces.

    Gracias!

  15. harold ocaña
    viernes, 3 de octubre de 2008 a las 20:54 | #16

    Muchas gracias

    Ya probé el codigo y funciona excelentemente.

  1. Sin trackbacks aún.