Ejemplo de 3 listas desplegables con PHP y AJAX usando POST
Gracias a NESS ROMAN que estuvo observando el ejemplo anterior, encontró algunos errores si se puede decir así, me explica que de acuerdo al código del script está seleccionando varios códigos postales sin considerar los datos anteriormente seleccionados (estado y dirección municipal), bueno es cierto, el problema en sí radica que la tabla no está normalizada, si lo estuviera trabajaríamos directamente con los códigos y no con las descripciones y esto evitaría el problema que se presenta.
Bueno haremos las cambios solicitados para esta entrada y ampliar el tema AJAX y las consultas utilizando 2 cosas nuevas la 1ra es usando el método POST donde podrán encontrar en internet muchos ejemplos y el 2do e importante es utilizar una función en JavaScript llamada formData2QueryString que encontré hace mucho en un libro y me parece interesante compartir con ustedes.
Qué hace esta función, comúnmente encontramos que al hacer POST enviamos en el método send de AJAX los parámetros que se envía de esta manera var1=valor1&var2=valor2…. etc. es fácil concatenar esto pero que pasaría si tuvieramos muchos campos y de diferente tipo (input, select,textarea, etc) en el formulario, esta función hace esto (concatenar los campos y sus valores) por nosotros y considera hasta campos con muchos valores (como indica en la ayuda collapseMulti), espero lo entiendan y seguir recibiendo sus comentarios.
Empecemos, lo primero es la página principal
listaejemplo2.htm
<form id="f1" action="cargar2.php" method="post"> <table border="1" width="40%" bgcolor="#FFFFCC"> <tbody> <tr> <td width="20px">Estado:</td> <td><input id="carga" name="carga" type="hidden" /> <select id="sEst" name="sEst"></select></td> </tr> <tr> <td>Delemuni:</td> <td><select id="sDM" name="sDM"></select></td> </tr> <tr> <td>Colonia:</td> <td><select id="sCol" name="sCol"></select></td> </tr> <tr> <td>Cod.Postal:</td> <td><select id="sCP" name="sCP" size="2"></select></td> </tr> </tbody> </table> </form>
Luego insertamos en este script el código javascript
<script language="JavaScript" type="text/javascript" src="formdata2querystring.js"> </script><script language="JavaScript" type="text/javascript"> // creando objeto XMLHttpRequest de Ajax var obXHR; try { obXHR=new XMLHttpRequest(); } catch(err) { try { obXHR=new ActiveXObject("Msxml2.XMLHTTP"); } catch(err) { try { obXHR=new ActiveXObject("Microsoft.XMLHTTP"); } catch(err) { obXHR=false; } } } function cargar(obId) { var obCarga = document.getElementById('carga').value=obId; var obCon = document.getElementById(obId); obForm = formData2QueryString(document.f1); obXHR.open('POST', 'cargar2.php'); obXHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=ISO-8859-1'); obXHR.onreadystatechange = function() { if (obXHR.readyState == 4 &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; obXHR.status == 200) { obXML = obXHR.responseXML; obDes = obXML.getElementsByTagName("descri"); obCon.length=obDes.length; for (var i=0; i obCon.options[i].value=obDes[i].firstChild.nodeValue; obCon.options[i].text=obDes[i].firstChild.nodeValue; } } } obXHR.send(obForm); } </script>
El script PHP que trabajará en el servidor sería:
carga2.php
sql=$sql; $this->cn = mysql_connect("localhost","usuario","clave"); mysql_select_db("postales"); $this->cargar(); } function cargar() { $this->rs=mysql_query($this->sql); header('Content-Type: text/xml'); echo "\n"; echo "\n"; echo "Seleccione"; while (list($descri) = mysql_fetch_row($this->rs)){ echo "$descri\n"; } echo "\n"; } function __destruct() { mysql_close($this->cn); } } extract($_POST); switch ($carga){ case 'sEst': $sql = "SELECT DISTINCT estado FROM codigos"; break; case 'sDM': $sql = "SELECT DISTINCT delemuni FROM codigos WHERE estado='$sEst' ORDER BY delemuni"; break; case 'sCol': $sql = "SELECT DISTINCT colonia FROM codigos WHERE estado='$sEst' AND delemuni='$sDM' ORDER BY colonia"; break; default: $sql = "SELECT DISTINCT cp FROM codigos WHERE estado='$sEst' AND delemuni='$sDM' AND colonia='$sCol' ORDER BY cp"; } $clCar = new cargar($sql); ?>
Agregamos al script html las siguientes sentencias, para generar las autocargas con AJAX:
onload="cargar('sEst')" <select id="sEst" name="sEst" onchange="cargar('sDM')"></select> <select id="sDM" name="sDM" onchange="cargar('sCol')"></select> <select id="sCol" name="sCol" onchange="cargar('sCP')"></select>
Pueden probar el ejemplo aquí
Puedes ver el ejemplo enviando datos mediante el método GET aquí
Descargar los archivos para este ejemplo aquí
Gracias nuevamente a NESS
Y seguiremos visitando este mundo fascinante de AJAX en próximas entradas.
Hasta pronto.
I really like this internet site because quite a lot of utile material
on here : D.
Hey there, You’ve done a great job.
@ferand0
Pues la base de datos la obtuve creo que de la CONAPO o SEPOMEX en uno de sus portales… actualmente estoy trabajando en un proyecto para la SECTUR y creo que en la empresa consiguieron la base de datos directamente de la CONAPO.
Hola Antonio, chvr tu glob. Saludos espero nos veamos pronto. estaré pendiente de tus artículos. sigue así.
@NESS
buen dia, una preguntota, de donde bajaste la base de sepomex? gracias
Antonio, me han servido de mucho tus ejemplos, estoy empezando a interactuar con php y ajax, este sitio arriba mencionado es el primero que trato de hacer, quiciera ver la posibilidad que me mostraras algunos ejemplos de mostrat 2 listas deplegables y registros de una tabla………..
eswpecificando
tengo un tabla llamada municipios que esta en una lista desplegable y esta me lleva a otra lista despegable que carga otra tabla la cual al seleccionar la opcion quiciera que me desplege en un div los datos de otra tabla
te agradeceria si me pudiras olrientar
Hola Antonio
Ando haciendo un codigo parecido pero para que me de los datos desde codigo postal, seria posible que le echaras un vistazo ?
Gracias espero puedas contactarme
saludos
Hi,
Can i get a one small photo from your site?
Thank you
AlexAxe
Muchas gracias, por el ejemplo nuevamente.. te comento que sigo analizándolo sólo que como estoy actualmente desarrollando un sitio pues he estado ocupado.
En cuanto a las tablas normalizadas, yo tengo una base de datos que descarge de SEPOMEX (Servicio Postal Mexicano). Pero aún así contiene muchos errores, en mis ratos libres cada que puedo trato de depurar lo más posible la tabla de ciudades,estados,colonias,codigos.
Como podrás darte cuenta es un gran trabajo depurar esa tabla, ya que contiene cerca de 90 mil registros.
En estos días no he tenido tiempo de implementar otro tipo de consultas más específicas para tu código, pero en cuanto tenga tiempo lo haré.
Un Saludo y muchas gracias.