Select dinamiche : regioni province comuni

Stato
Chiusa ad ulteriori risposte.

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao a tutti,
ho usato jquery per la chiamata ajax e per popolare le select
Lo script php crea il codice jquery che verrà eseguito dalla funzione eval()
E'necessario un databae mysql e 3 tabelle che potete scaricare qui
Qui potete trovare lo script in funzione

Ho creato due pagine
index.html : contiene le select e le funzioni javascript
HTML:
<!DOCTYPE html>
<html>
    <head>
        <title>Comuni italiani</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
        <style type="text/css">
            div.ricerca {
                line-height: 34px;
            }
            div.ricerca span {
                display: inline-block;
                width: 110px;
                text-align: right;
                padding-right: 4px;
            }
        </style>
        <script type="text/javascript">
            $(document).ready(function(){
                comuni();
                $("select").change(function(){
                    comuni();
                })
            })
            function comuni() {                
                $.ajax({
                    type: "POST",
                    url: "comuni.php",
                    data: $("#ricerca").serialize(),
                    success: function(response){
                        eval(response);
                    }
                }); 
            }
        </script>
    </head>
    <body>
        <div class="ricerca">
            <form id="ricerca">
                <span>Regione :</span>
                <select name="regione">
                    <option value=""></option>
                </select><br/>
                <span>Provincia :</span>
                <select name="provincia">
                    <option value=""></option>
                </select><br/>
                <span>Comune :</span>
                <select name="comune">
                    <option value=""></option>
                </select>
            </form>
        </div>
    </body>
</html>
comuni.php : contiene la connessione al db e le query per popolare le select
PHP:
<?php

// recupero vaolori delle select
$regione = $_REQUEST['regione'];
$provincia = $_REQUEST['provincia'];
$comune = $_REQUEST['comune'];
// mi connetto al database
$sql = new mysqli("localhost", "root", "", "database");
// estraggo tutte le regioni
$query = "SELECT * FROM regioni";
$result = $sql->query($query);
// svuoto la select regione
echo "$('select[name=\"regione\"]').empty();";
// aggiungo una option vuota
echo "$('select[name=\"regione\"]').append('<option value=\"\"></option>');";
// ciclo i risultati della query
while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
    // imposto il selected sull'eventuale regione scelta
    $selected = "";
    if ($row['idRegione'] == $regione) {
        $selected = "selected=\"selected\"";
    }
    // popolo la select
    echo "$('select[name=\"regione\"]').append('<option $selected value=\"" . $row['idRegione'] . "\">" . addslashes($row['nomeRegione']) . "</option>');";
}
// se è stata scelta una regione
if (!empty($regione)) {
    // estraggo le province della regione scelta
    $query = "SELECT * FROM province WHERE idRegione ='$regione'";
    $result = $sql->query($query);
    // svuoto la select provincia
    echo "$('select[name=\"provincia\"]').empty();";
    // aggiungo una option vuota
    echo "$('select[name=\"provincia\"]').append('<option value=\"\"></option>');";
    // ciclo i risultati della query
    while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
        // imposto il selected sull'eventuale provincia scelta
        $selected = "";
        if ($row['siglaProvincia'] == $provincia) {
            $selected = "selected=\"selected\"";
        }
        // popolo la select
        echo "$('select[name=\"provincia\"]').append('<option $selected value=\"" . $row['siglaProvincia'] . "\">" . addslashes($row['nomeProvincia']) . "</option>');";
    }
}
// se è stata scelta una provincia
if (!empty($provincia)) {
    // estraggo i comuni della provincia scelta
    $query = "SELECT * FROM comuni WHERE provincia ='$provincia'";
    $result = $sql->query($query);
    // svuoto la select comune
    echo "$('select[name=\"comune\"]').empty();";
    // aggiungo una option vuota
    echo "$('select[name=\"comune\"]').append('<option value=\"\"></option>');";
    // ciclo i risultati della query
    while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
        // imposto il selected sull'eventuale comune scelto
        $selected = "";
        if ($row['Istat'] == $comune) {
            $selected = "selected=\"selected\"";
        }
        // popolo la select
        echo "$('select[name=\"comune\"]').append('<option $selected value=\"" . $row['Istat'] . "\">" . utf8_encode(addslashes($row['Comune'])) . "</option>');";
    }
}
?>
come sempre si accettano consigli critiche migliorie domande ... :byebye:
ps:
anche se sembrano andare a capo tutte le echo devono stare su una riga
 
Ultima modifica di un moderatore:

leo_grafica

Nuovo Utente
21 Nov 2008
3
0
0
ho copiato tutto per vedere come funziona:
1) ho creato una cartella ''contatti'' con all'interno la pagina''index.html''
2) ho creato la pagina (php) chiamandola ''comuni.php''
3) ho copiato all'interno la cartella ''comuni'' con i 3 database

Visualizzo correttamente la pagina ma non le voci all'interno dei select.... dove ho sbagliato?
Grazie dell'aiuto!!
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao, non ho capito il punto 3 : i database vanno creati con phpmyadmin
e qui imposti i tuoi parametri di connessione
PHP:
// mi connetto al database
$sql = new mysqli("localhost", "root", "", "database");
 

leo_grafica

Nuovo Utente
21 Nov 2008
3
0
0
Ciao, non ho capito il punto 3 : i database vanno creati con phpmyadmin
e qui imposti i tuoi parametri di connessione
PHP:
// mi connetto al database
$sql = new mysqli("localhost", "root", "", "database");
forse ho fatto il passo più lungo della gamba...
non ho mai lavorato prima con database e php...

al punto 3 intendevo che ho scaricato i 3 file di esempio (gli elenchi regioni,province e comuni) e sono in una cartella ''comuni'' all'interno del sito

...adesso ho scaricato anche phpMyAdmin ma non ci capisco niente...

mi puoi aiutare?
puoi darmi qualche dritta step by step?

grazie
 

Domenico Cafaro

Nuovo Utente
3 Set 2013
12
0
0
Ciao, ho inserito queste select dinamiche in un form.
Solo che quando il file php che invia la mail recupera i valori della select, non recupera il nome del comune ma il codice istat. Quindi nella mail mi compare il codice istat e non il nome del comune.

Come faccio a fargli recuperare il nome del comune?

Grazie in anticipo.
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao, puoi modificare il value della ultima option cambiando $row['Istat'] con $row['Comune']
 

Domenico Cafaro

Nuovo Utente
3 Set 2013
12
0
0
Ciao, puoi modificare il value della ultima option cambiando $row['Istat'] con $row['Comune']
Ciao, ho provato.
Ma quando seleziono il campo comune nella select questo sparisce non mantiene la selezione. E se provo ad inviare il form, la mail arriva con il campo comune vuoto.
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
hai scritto cosi ?
PHP:
.append('<option $selected value=\"" . $row['Comune'] . "\">".utf8_encode(addslashes($row['Comune'])) . "</option>');";
lo hai online o in locale ?
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
potrebbe essere un problema di apici
prova a cambiare
PHP:
$row['Comune']
con
PHP:
utf8_encode(addslashes($row['Comune']))
 

Domenico Cafaro

Nuovo Utente
3 Set 2013
12
0
0
potrebbe essere un problema di apici
prova a cambiare
PHP:
$row['Comune']
con
PHP:
utf8_encode(addslashes($row['Comune']))
Ho effettuato la modifica, ed ho modificato anche da

PHP:
if ($row['Istat'] == $comune)
a

PHP:
if ($row['Comune'] == $comune)
Adesso nella mail mi compare il nome del comune selezionato nel form, e nel form non scompare più il comune quando lo sleziono.

Grazie per l'aiuto!!
 

hantos

Nuovo Utente
17 Ott 2008
21
0
1
Salve ho scaricato lo script e funziona bene

però quando devo trasferire i dati selezionati sul mio database invece del nome della regione mi scrive IdRegione

il codice html lo modificato così
HTML:
        <div class="ricerca">
            <form id="ricerca" method="POST"  action="formmail_prova.php">
                <span>Regione :</span>
                <select name="regione" name="nomeRegione">
                    <option value="regione"></option>
                </select><br/>
                <span>Provincia :</span>
                <select name="provincia">
                    <option value=""></option>
                </select> <br/>
                <span>Comune :</span>
                <select name="comune">
                    <option value=""></option>
                </select>

           <br />
  <button name="B3" onClick="invia();" style="font-family: Bookman Old Style; color: #800000; font-weight: bold; border: 2px outset #F0F0FF; background-color: #FDEAAA; width:248; height:48">
  Invia i dati nel database</button></p>
</form>

        </div>
il php cosi
PHP:
<?php

// recupero vaolori delle select
$regione = $_REQUEST['regione'];
$provincia = $_REQUEST['provincia'];
$comune = $_REQUEST['comune'];
// mi connetto al database
$sql = new mysqli("localhost", "root", "", "database");
// estraggo tutte le regioni
$query = "SELECT * FROM regioni";
$result = $sql->query($query);
// svuoto la select regione
echo "$('select[name=\"regione\"]').empty();";
// aggiungo una option vuota
echo "$('select[name=\"regione\"]').append('<option value=\"\"></option>');";
// ciclo i risultati della query
while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
    // imposto il selected sull'eventuale regione scelta
    $selected = "";
    if ($row['idRegione'] == $regione) {
        $selected = "selected=\"selected\"";
    }
    // popolo la select
    echo "$('select[name=\"regione\"]').append('<option $selected value=\"" . $row['idRegione'] . "\">" . addslashes($row['nomeRegione']) . "</option>');";
}
// se è stata scelta una regione
if (!empty($regione)) {
    // estraggo le province della regione scelta
    $query = "SELECT * FROM province WHERE idRegione ='$regione'";
    $result = $sql->query($query);
    // svuoto la select provincia
    echo "$('select[name=\"provincia\"]').empty();";
    // aggiungo una option vuota
    echo "$('select[name=\"provincia\"]').append('<option value=\"\"></option>');";
    // ciclo i risultati della query
    while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
        // imposto il selected sull'eventuale provincia scelta
        $selected = "";
        if ($row['siglaProvincia'] == $provincia) {
            $selected = "selected=\"selected\"";
        }
        // popolo la select
        echo "$('select[name=\"provincia\"]').append('<option $selected value=\"" . $row['siglaProvincia'] . "\">" . addslashes($row['nomeProvincia']) . "</option>');";
    }
}
// se è stata scelta una provincia
if (!empty($provincia)) {
    // estraggo i comuni della provincia scelta
    $query = "SELECT * FROM comuni WHERE provincia ='$provincia'";
    $result = $sql->query($query);
    // svuoto la select comune
    echo "$('select[name=\"comune\"]').empty();";
    // aggiungo una option vuota
    echo "$('select[name=\"comune\"]').append('<option value=\"\"></option>');";
    // ciclo i risultati della query
    while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
        // imposto il selected sull'eventuale comune scelto
        $selected = "";
        if ($row['Istat'] == $comune) {
            $selected = "selected=\"selected\"";
        }
        // popolo la select
        echo "$('select[name=\"comune\"]').append('<option $selected value=\"" . $row['comune'] . "\">" . utf8_encode(addslashes($row['Comune'])) . "</option>');";
    }
}
?>
 
Ultima modifica di un moderatore:

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao, il value della select contiene l'id della regione ed è quello che viene passato come parametro.
Ti converrebbe fare una query nella tua pagina formmail_prova.php e recuperare il nome dall'id
PHP:
$query = "SELECT * FROM regioni WHERE idRegione = " . (int) $_REQUEST['idRegione'];
 

hantos

Nuovo Utente
17 Ott 2008
21
0
1
provo e riprovo ma non funziona, il codice con cui invio i dati al database è il seguente

dove la query che mi hai indicato ?????, grazieeeee

PHP:
<?session_start();
$titolo=$_POST[titolo];
$regione=$_POST[regione];
$nomeRegione=$_POST[nomeRegione];
$province=$_POST[province];
$provincia=$_POST[provincia];
$comune=$_POST[comune];
$citta=$_POST[citta];

$visibile=$_POST[visibile];
$_SESSION['categoria']=$categoria;


include("datastring.inc.php");



$db = mysql_connect($db_host, $db_user, $db_password);

if ($db == FALSE)
die ("Errore nella connessione");
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database");

$categoria=ucwords($categoria);
$query = "INSERT INTO dati (titolo,nomeRegione,regione,province,provincia,comune,citta,cap,categoria,visibile,data) VALUES ('$titolo','$nomeRegione','$regione','$province','$provincia','$comune','$citta','$cap','$categoria','$visibile',now())";


if (mysql_query($query, $db)){
$_SESSION['ultimoid']=mysql_insert_id();
echo "$_SESSION[ultimoid]";

echo "L'articolo del $row[comune] è stato inserito correttamente<br>";
echo " mail('info@xzczcxxinea3000.com', 'Messaggio dal mio sito web', $nomecontatto)";

}
mysql_close($db);
?>
<html>
 
Ultima modifica di un moderatore:

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
la query la devi inserire tu nel tuo file php prima di fare la insert. Togli i due name che hai messo nella select. Esegui la query ed estrai il nome della regione
PHP:
$nomeRegione = $row['nomeRegione'];
 

hantos

Nuovo Utente
17 Ott 2008
21
0
1
Salve Criric sto provando a fare la modifica che mi hai suggerito ma non riesco a farlo funzionare

questo è il file che fa funzionare il form, se cambio qualcosa non funziona più

PHP:
<?php

// recupero vaolori delle select
$regione = $_REQUEST['regione'];
$provincia = $_REQUEST['provincia'];
$comune = $_REQUEST['comune'];
$CAP = $_REQUEST['CAP'];
// mi connetto al database
$sql = new mysqli("********", "********", "********", "********");
// estraggo tutte le regioni
$query = "SELECT * FROM regioni";
$result = $sql->query($query);
// svuoto la select regione
echo "$('select[name=\"regione\"]').empty();";

// aggiungo una option vuota
echo "$('select[name=\"regione\"]').append('<option value=\"\"></option>');";


// ciclo i risultati della query
while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
    // imposto il selected sull'eventuale regione scelta
    $selected = "";
    if ($row['idRegione'] == $regione) {
        $selected = "selected=\"selected\"";
    }
   // popolo la select
    echo "$('select[name=\"regione\"]').append('<option $selected value=\"" . $row['idRegione']. "\">" . addslashes($row['nomeRegione']) . "</option>');";
}



// se è stata scelta una regione
if (!empty($regione)) {
    // estraggo le province della regione scelta
    $query = "SELECT * FROM province WHERE idRegione ='$regione'";
    $result = $sql->query($query);
    // svuoto la select provincia
    echo "$('select[name=\"provincia\"]').empty();";
    // aggiungo una option vuota
    echo "$('select[name=\"provincia\"]').append('<option value=\"\"></option>');";
    // ciclo i risultati della query
    while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
        // imposto il selected sull'eventuale provincia scelta
        $selected = "";
        if ($row['siglaProvincia'] == $provincia) {
            $selected = "selected=\"selected\"";
        }
        // popolo la select
        echo "$('select[name=\"provincia\"]').append('<option $selected value=\"" . $row['siglaProvincia'] . "\">" . addslashes($row['nomeProvincia']) . "</option>');";
    }
}
// se è stata scelta una provincia
if (!empty($provincia)) {
    // estraggo i comuni della provincia scelta
    $query = "SELECT * FROM comuni WHERE provincia ='$provincia'";
    $result = $sql->query($query);
    // svuoto la select comune
    echo "$('select[name=\"comune\"]').empty();";
    // aggiungo una option vuota
    echo "$('select[name=\"comune\"]').append('<option value=\"\"></option>');";
    // ciclo i risultati della query
    while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
        // imposto il selected sull'eventuale comune scelto
        $selected = "";
        if ($row['Comune'] == $comune) {
            $selected = "selected=\"selected\"";
        }
        // popolo la select
        echo "$('select[name=\"comune\"]').append('<option $selected value=\"" . $row['Comune'] . "\">" . utf8_encode(addslashes($row['Comune'])) . "</option>');";
    }
}



?>
mi poi aiutare grazie mille
 
Ultima modifica di un moderatore:

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
non devi modificare quel file ma quello che hai postato che fa la insert. Fai la query sulla tabella regioni con l'id che ti arriva in post e recuperi il nome poi fai la INSERT
in pratica devi farla tra
PHP:
if ($db == FALSE)
die ("Errore nella connessione");
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database");
e
PHP:
$categoria=ucwords($categoria);
$query = "INSERT INTO dati (titolo,nomeRegione,regione,province,provincia,comune,citta,cap,categoria,visibile,data) VALUES ('$titolo','$nomeRegione','$regione','$province','$provincia','$comune','$citta','$cap','$categoria','$visibile',now())";
 
Stato
Chiusa ad ulteriori risposte.