Avevo bisogno di un sistema che alla selezione di una regione aggiornasse il menu a tendina della provincia. Cercando in rete ho trovato un pò di cose che ho messo insieme.
Innanzitutto un dump di mysql con le tabelle con le regioni e le provincie italiane, e con le opportune relazioni:
scarica qui il dump mysql file perso durante un trasferimento…
poi bisogna creare le 2 select
quella della regione prende i dati da mysql e chiama la funzione javascript che valorizzerà la provincia:
<select name="id_regione" onChange="Riempi(this.options.selectedIndex)">
<?php
$query = "SELECT * FROM regioni WHERE 1 ORDER BY nomeregione";
$result=mysql_query($query);
echo '<option value=""> </option>';
while($row=mysql_fetch_array($result)){
echo '<option value="'.$row['id_regione'].'">'.$row['nomeregione'].'</option>';
}
?>
</select>
La select della provincia invece la lascio vuota perchè sarà riempita dal javascript:
<select name="id_provincia"> <option> </option> <option> </option> <option> </option> <option> </option> <option> </option> <option> </option> <option> </option> </select>
Ho inserito nell’esempio 7 campi option vuoti per risolvere un problema di Netscape, (non riesce a creare nuovi fields nelle select, almeno così dicono in rete, io non ho provato). Per tutti gli altri browser è sufficiente creare la select vuota.
A questo punto manca il javascript, che va costruito interrogando il db nuovamente per creare gli array utilizzati per valorizzare la select della provincia:
<SCRIPT>
<!--
var prov=new Array();
var sigle=new Array();
<?php
$query = "SELECT * FROM regioni WHERE 1 ORDER BY nomeregione";
$result=mysql_query($query);
$counter=1;
while($row=mysql_fetch_array($result)){
$query2 = "SELECT * FROM province WHERE id_regione = ".$row['id_regione']." ORDER BY nomeprovincia";
$result2=mysql_query($query2);
$counter2=0;
$str_prov="";
$str_sigla="";
while($row2=mysql_fetch_array($result2)){
if($counter2>0){ $str_prov.=","; $str_sigla.=","; }
$str_prov.='"'.$row2['nomeprovincia'].'"';
$str_sigla.='"'.$row2['id_provincia'].'"';
$counter2++;
}
echo "prov[".$counter."]=new Array(".$str_prov.") \n";
echo "sigle[".$counter."]=new Array(".$str_sigla.") \n";
$counter++;
}
?> function Riempi(source)
{
with (document.ins.id_provincia)
{
while (options.length > 0)
options[0]=null;
for (i=0;i<prov[source][/source].length;i++)
options[i]=new Option(prov[source][/source][i],sigle[source][/source][i])
options.selectedIndex=0;
}
}
//-->
</SCRIPT>
E questo è tutto!


Grazie! Era proprio quello che cercavo. L’ho già adattato alla mia situazione e funziona alla perfezione.
Saluti Berta
Mi fa piacere ti sia stato d’aiuto! Ciao!
Ciao, che tu sappia ci sono limitazioni nel numero di campi contenuti nell’array? Tu in pratica pre-carichi degli array e questo finche si tratta di regioni-provincie funziona bene. Nel mio caso però devo fare anche il terzo step ovvero quello delle provincie-citta.
In questo caso io dovrei andare a precaricare due array: id_citta e citta. ciascuno di questi due array conterrà un numero di inserimenti pari al numero dei comuni italiani (circa 8000). Facendo del debug e osservando il codice html generato vedo che invece il riempimento si ferma all’id citta = 107. Hai qualche idea?
Che io sappia non ci sono limitazioni, ma non l’ho testato in questa maniera, e se vedi nell’html delle limitazioni potrebbe essere…
Hai provato a controllare con diversi browser? se c’è una limitazione è sicuramente diversa da browser a browser, se invece il comportamento è identico potrebbe essere altrove il problema
ciao grazie per il codice che hai postato mi è utilissimo però non riesco a scaricare il dump mysql, potresti rimetterlo online? grazie
ciao, vorrei scaricare il dumpo db ma il link non funziona, puoi aiutarmi?
Scusate ma ho perso il dump del db in qualche trasferimento! Se lo trovare inviatemelo e lo reinserisco.
scusate, posso una domanda??? a me lo script non funziona…..probabilmente è un problema di javascript….perchè mi carica tutta la pagina senza errori