select regioni-provincie con javascript, php e mysql

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:

[php]
<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>
[/php]

La select della provincia invece la lascio vuota perchè sarà riempita dal javascript:

[php]
<select name="id_provincia">
<option> </option>
<option> </option>
<option> </option>
<option> </option>
<option> </option>
<option> </option>
<option> </option>
</select>
[/php]

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:

[php]
<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>
[/php]

E questo è tutto!

8 thoughts on “select regioni-provincie con javascript, php e mysql

  1. Berta says:

    Grazie! Era proprio quello che cercavo. L’ho già adattato alla mia situazione e funziona alla perfezione.

    Saluti Berta

  2. Luca says:

    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?

  3. admin says:

    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

  4. raging says:

    ciao grazie per il codice che hai postato mi è utilissimo però non riesco a scaricare il dump mysql, potresti rimetterlo online? grazie

  5. Francesca says:

    scusate, posso una domanda??? a me lo script non funziona…..probabilmente è un problema di javascript….perchè mi carica tutta la pagina senza errori

Leave a Reply

Your email address will not be published. Required fields are marked *