Listas desplegables llenadas dinámicamente (tag select) 1er. Caso
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.
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
ME SALVASTE LA VIDAA..!!!!
@carian Hola carian, tienes varias formas de contactarme, muéstrame como va tu código y lo revisamos…. saludos
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
necesito ayuda para hacer menus desplegables.
gracias.
¿qué problema tienes?, recuerda que los ejemplos son de listas desplegables mas no de menús desplegables
Saludos y gracias por visitar mi blog
@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
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
@admin
mucha gracias Antonio anda de maravillas… no sabes como me salvaste… mil veces gracias…
@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.
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
@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!
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»;
}
}
?>
Thanks for making such a valuable blog, sincerely Kobos Mathers.
Gucci Shoes
Gracias por el aporte, esta buscando algo asi por la red.
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!
Muchas gracias
Ya probé el codigo y funciona excelentemente.