crea un file PHP che ritorna un array JS con i dati della select da riempire:
Metti di avere 3 select:
Codice PHP:
<select name="regione" onchange="populateSelect(this.options[this.selectedIndex].value, 'regione','citta')">
<option value="lombardia">Lombardia</option>
<option value="veneto">Veneto</option>
.
.
.
<option value="sicilia">Sicilia</option>
</select>
<select name="citta" onchange="populateSelect(this.options[this.selectedIndex].value, 'citta', 'via')"></select>
<select name="via"></select>
A questo punto hai bisogno di uno script PHP da chiamare con Ajax ed una funzione che faccia la richiesta in modo corretto.
X il file, creo un file PHP che legge un parametro di query che sarà: citta={Città selezionata}&ottenere=via oppure regione={Regione selezionata}&ottenere=citta
Codice PHP:
$where = isset($_GET['citta']) ? 'citta' : isset($_GET['regione']) ? 'regione' : null;
$ottenere = $_GET['ottenere'];
if($ottenere && $where){
//Metti che questo file crei un link reference al DB chiamato $db
include("db/mysql_connect.php");
$valore = $_GET[$where];
//Ovviamente la tua query può essere molto diversa
$query = "SELECT $ottenere FROM TABELLA_MASTODONTICA WHERE $where LIKE '$valore'"
$result = mysql_query($query, $db);
$ret = '';
while($row = mysql_fetch_array($result))
{
$ret .="'".$row[$ottenere]."',";
}
if(strlen($ret) > 0){
$ret = substr($ret, 0, strlen($ret) - 1);
}
echo "myArr = [$ret]";
}
Poi chiami il file con una chiamata ajax, io uso sempre una libreria per questo, facciamolo con Prototypejs
Codice PHP:
var myArr = [];
function populateSelect(value, where, ottenere)
{
var url = 'new_file.php'
// notice the use of a proxy to circumvent the Same Origin Policy.
eval("new Ajax.Request(url, { method: 'get', contentType : 'text/javascript', parameters : { "+where+" : '"+value+"', ottenere : '"+ottenere+"'}, onSuccess: function(transport) { eval(transport.responseText); populate('"+ottenere+"');}});");
}
function populate(selectName)
{
var sel = document.getElementsByName(selectName)[0];
var all = Element.descendants(sel);
for(i = 0; i < all.length; i++)
{
sel.remove(all[i]);
}
for(i = 0; i < myArr.length; i++)
{
var opt = document.createElement('option');
opt.value = myArr[i];
opt.appendChild(document.createTextNode(myArr[i]));
sel.appendChild(opt);
}
}
Dovrebbe andare, con prototype-1.6.0.2.js, io l'ho testato e va senza problema su Firefox, Opera ed anche su Safari.