Requisitos:
Apache - PHP - MySQL
Librería ez_sql
Conocimiento avanzado de PHPOO
Interpretación del código
Descarguemos la libreria de base de datos http://justinvincent.com/wp-content/uploads/2010/10/ez_sql_2.05.zip
Ahora creemos la siguiente estructura en nuestro servidor
www/
php/
ez_sql/
selects.php
db.php
javascript/
ajax.js
selects.js
index.php
Ahora llenamos los archivos con contenido:
index.php
Código HTML:
<html> <head> <title>Selects dinamicos AJAX</title> <script>baseurl = 'http://misitio.com';</script> <script language="javascript" type="text/javascript" src="javascript/ajax.js"></script> <script language="javascript" type="text/javascript" src="javascript/selects.js"></script> </head> <body> <form> <label>Selecciona el estado</label> <div> <select name="pais" id="pais" onchange="cambiar_select('cambiaCiudad', 'ciudad', 'ciudad', 'ciudad', 'cambiar_ciudades', this.value, '100%', false)"> <option>Seleccione</option> <?php require_once('php/db.php'); if($paises = $db->get_results('select pais from paises order by pais asc')): foreach($paises as $row): echo '<option value="'.$row->pais.'">'.$row->pais.'</option>'; endforeach; else: echo '<option>No existen paises</option>'; endif; ?> </select> </div> <label>Ciudad</label> <div id="cambiaCiudad"><select><option>Selecciona pais</option></select></div> </form> </body>
Ahora llenamos los archivos javascript
ajax.js
Código HTML:
function newAjax() { var xmlHttp=null; if (window.ActiveXObject) xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); else if (window.XMLHttpRequest) xmlHttp = new XMLHttpRequest(); return xmlHttp; } function addEvent(elemento,nomevento,funcion,captura) { if (elemento.attachEvent) { elemento.attachEvent('on'+nomevento,funcion); return true; } else if (elemento.addEventListener) { elemento.addEventListener(nomevento,funcion,captura); return true; } else return false; }
selects.js
Código HTML:
function cambiar_select(divId, tagName, selectName, selectId, funcion, parametro, Width, AddEvent)
{
url = baseurl+'php/selects.php?funcion='+funcion+'¶metro='+parametro+'&tagName='+tagName;
ajax = newAjax();
ajax.onreadystatechange = function()
{
var div = document.getElementById(divId);
div.innerHTML = '';
if(ajax.readyState == 4)
{
var xml = ajax.responseXML;
var opt = xml.getElementsByTagName(tagName);
var select = document.createElement('select');
select.name = selectName;
select.id = selectId;
select.style.width = Width;
var seleccione = document.createElement('option');
var texto = document.createTextNode('Seleccione');
seleccione.appendChild(texto);
seleccione.value = 'seleccione';
select.appendChild(seleccione);
div.appendChild(select);
if(parametro != 'seleccione')
{
for(i=0;i<opt.length;i++)
{
var option = document.createElement('option');
var text = document.createTextNode(opt[i].firstChild.nodeValue);
option.appendChild(text);
select.appendChild(option);
}
if(AddEvent == true)
{
addUrl = baseurl+'php/php_selects.php?funcion='+funcion+'_addEvent¶metro=NULL&tagName=NULL';
addEv = newAjax();
addEv.onreadystatechange = function()
{
if(addEv.readyState == 4)
{
funcion = addEv.responseText;
}
}
addEv.open('GET',addUrl,true);
addEv.send(null);
addEvent(select,'change',function(){ eval(funcion); },false);
}
}
}
else
{
div.innerHTML = '<img src="'+baseurl+'images/cargando.gif" />';
}
}
ajax.open('GET',url, true);
ajax.send(null);
}
Procedemos a llenar los archivos en la carpeta php
db.php
Código PHP:
require_once('ez_sql/shared/ez_sql_core.php');
require_once('ez_sql/mysql/ez_sql_mysql.php');
$db = new ezSQL_mysql('database_user','database_password','select_database','database_host');
selects.php
Código PHP:
require("db.php");
if($_REQUEST)
{
$funcion = $_REQUEST["funcion"];
$parametro = $_REQUEST["parametro"];
$tagName = $_REQUEST["tagName"];
if(function_exists($funcion))
{
echo $funcion($parametro);
}
else
{
$xml="<?xml version="1.0"?>n";
$xml.="<marco>n";
$xml.="<".$tagName.">Error de conexion</".$tagName.">";
$xml.="</marco>";
header('Content-Type: text/xml');
echo $xml;
}
}
function cambiar_ciudades($pais)
{
global $db,$tagName;
$xml="<?xml version="1.0"?>n";
$xml.="<marco>n";
if($ciudades = $db->get_results('select ciudad from ciudades where pais = "'.$pais.'"'))
{
foreach($ciudades as $row)
{
$xml.= "<".$tagName.">".$row->ciudad."</".$tagName.">n";
}
}
else
{
$xml.="<".$tagName.">No existen ciudades</".$tagName.">";
}
$xml.="</marco>n";
header('Content-Type: text/xml');
return $xml;
}
//FIN FUNCION
Esta es la estructura de la base de datos
Código PHP:
CREATE TABLE IF NOT EXISTS `paises` (
`id` int(2) NOT NULL AUTO_INCREMENT,
`estado` varchar(100) COLLATE utf8_spanish_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=5 ;
INSERT INTO `estados` (`id`, `estado`) VALUES
(1, 'Venezuela'),
(2, 'Colombia'),
(3, 'Ecuador'),
(4, 'Argentina');
CREATE TABLE IF NOT EXISTS `ciudades` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`pais` varchar(100) COLLATE utf8_spanish_ci NOT NULL,
`ciudad` varchar(150) COLLATE utf8_spanish_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=7 ;
INSERT INTO `ciudades` (`id`, `estado`, `ciudad`) VALUES
(1, 'Venzuela', 'Valencia'),
(2, 'Venezuela', 'Caracas'),
(3, 'Colombia', 'Bogota'),
(4, 'Argentina', 'Buenos Aires'),
(5, 'Argentina', 'Andalucia'),
(6, 'Colombia', 'Cali');
Y eso debería hacer todo para que los selects cambien dependiendo del país por supuesto muchas gracias por leer... Saludos!