Select dinamiche : regioni province comuni

  • Creatore Discussione Creatore Discussione criric
  • Data di inizio Data di inizio
Stato
Chiusa ad ulteriori risposte.

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.606
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:
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!!
 
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");
 
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
 
Dalla pagina principale di phpmyadmin, ti basta creare il database e poi fare importa.

Selezioni le 3 tabelle e poi crei i collegamenti nella pagina php, inserendo i dati come ha detto criric
 
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.
 
Ciao, puoi modificare il value della ultima option cambiando $row['Istat'] con $row['Comune']
 
hai scritto cosi ?
PHP:
.append('<option $selected value=\"" . $row['Comune'] . "\">".utf8_encode(addslashes($row['Comune'])) . "</option>');";
lo hai online o in locale ?
 
potrebbe essere un problema di apici
prova a cambiare
PHP:
$row['Comune']
con
PHP:
utf8_encode(addslashes($row['Comune']))
 
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!!
 
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:
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'];
 
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:
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'];
 
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:
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.

Discussioni simili