Inicio > Ajax, DOM, HTML, Listas desplegables, MySql, Php5, Select, XMLHttpRequest > Ejemplo de 3 listas desplegables con PHP y AJAX usando POST

Ejemplo de 3 listas desplegables con PHP y AJAX usando POST

miércoles, 2 de septiembre de 2009 Dejar un comentario Ir a comentarios

lista_simple2Gracias 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;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.

  1. martes, 28 de mayo de 2013 a las 15:31 | #1

    I really like this internet site because quite a lot of utile material
    on here : D.

  2. domingo, 21 de abril de 2013 a las 06:40 | #2

    Hey there, You’ve done a great job.

  3. Ness Roman
    viernes, 18 de noviembre de 2011 a las 12:59 | #3

    @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.

  4. lunes, 28 de junio de 2010 a las 11:55 | #4

    Hola Antonio, chvr tu glob. Saludos espero nos veamos pronto. estaré pendiente de tus artículos. sigue así.

  5. ferand0
    miércoles, 14 de abril de 2010 a las 10:25 | #5

    @NESS
    buen dia, una preguntota, de donde bajaste la base de sepomex? gracias

  6. jueves, 18 de febrero de 2010 a las 20:11 | #6

    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

  7. Daniel Fatico
    sábado, 28 de noviembre de 2009 a las 23:38 | #7

    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

  8. sábado, 5 de septiembre de 2009 a las 08:24 | #8

    Hi,
    Can i get a one small photo from your site?
    Thank you
    AlexAxe

  9. NESS
    jueves, 3 de septiembre de 2009 a las 00:37 | #9

    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.

  1. Sin trackbacks aún.