Come realizzare delle select concatenate con PHP e jQuery?
In questo articolo tratteremo del concatenamento di select detto anche select a cascata.
Si tratta di un procedura che possiamo trovare spesso nel web e che consiste nel dare all’utente la possibilità di trovare un dato specifico attraverso alcuni passaggi: in pratica scegliendo una categoria nella prima select, la seconda verrà popolata con i dati relativi alla categoria scelta.
Si pensi ad esempio ad una prima select dove è possibile scegliere tra moto e automobili; una volta selezionata la categoria automobili si dovrà popolare la seconda select con le marche disponibili di automobili. Selezionando infine una marca, la terza select verrà popolata con i modelli disponibili per questa marca. In questo articolo vedremo un esempio molto semplice ma che fornirà le basi per comprendere la procedura da attuare anche in caso di cascate molto più complesse.
Quello che realizzeremo è visionabile in questa pagina di esempio. Premetto che l’argomento è piuttosto avanzato e presuppone delle conoscenze medio-avanzate di PHP e di MySql.
Come puoi vedere, l’esempio è molto minimalista. Una prima select che richiede la categoria, nella quale figurano: colori, fiori e attrezzi. Ed una seconda select, nella quale una volta selezionata la categoria, troveremo un elenco di voci riguardanti quella categoria.
Siccome nel caso reale i dati saranno molti di più e molto più complessi, immaginiamo ad esempio la classica cascata regione/provincia/comune, utilizzeremo un database MySql. A proposito di questa cascata: è così classica e richiesta, che abbiamo deciso di metterla a disposizione come risorsa gratuita. Il file da scaricare contiene l’esempio già pronto (come questo) e, molto utile, il database con le tre tabelle (regioni, province e comuni). Ma torniamo al nostro tutorial ed iniziamo a creare la struttura del database.
Creare la struttura del database
Creeremo dunque una tabella denominata categorie con i campi
- id_cat
- nome
Ed un’altra tabella denominata tipo con i seguenti campi
- id_tipo
- id_cat
- nome
In questo modo possiamo stabilire la corretta relazione tra le tabelle

Crea dunque il database selectExample ed esegui la query che ho preparato per facilitarti il compito. Oltre a creare le tabelle necessarie, inserisce anche i dati che ci serviranno per l’esercizio.
CREATE TABLE `categorie` ( `id_cat` int(4) unsigned NOT NULL auto_increment, `nome` varchar(40) NOT NULL, PRIMARY KEY (`id_cat`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; INSERT INTO `categorie` (`id_cat`, `nome`) VALUES (1, 'colori'), (2, 'fiori'), (3, 'attrezzi'); CREATE TABLE `tipo` ( `id_tipo` int(4) unsigned NOT NULL auto_increment, `id_cat` int(4) unsigned NOT NULL, `nome` varchar(40) NOT NULL, PRIMARY KEY (`id_tipo`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ; INSERT INTO `tipo` (`id_tipo`, `id_cat`, `nome`) VALUES (1, 1, 'giallo'), (2, 1, 'verde'), (3, 1, 'rosso'), (4, 1, 'grigio'), (5, 1, 'bianco'), (6, 2, 'margherita'), (7, 2, 'primula'), (8, 2, 'giglio'), (9, 2, 'mimosa'), (10, 3, 'martello'), (11, 3, 'cacciavite'), (12, 3, 'spatola'), (13, 3, 'chiave inglese'), (14, 3, 'pinza');
Preparazione della pagina principale
Passiamo ora a preparare il file principale ovvero select.php
<script type="text/javascript" src="jquery-1.4.1.js"></script><script type="text/javascript">// <![CDATA[
$(document).ready(function(){
});
// ]]></script>
</pre>
<form id="select_form">Scegli una categoria:
<select id="categorie"> </select>
Scegli un tipo:
<select> <option value="0">scegli...</option></select>
<input type="submit" value="conferma" /></form>
<pre>
Come vedi ho incluso jQuery. Infatti andremo a popolare la seconda select grazie ad una chiamata ajax.
Ho dichiarato un form contenente la prima select senza nessuna option e la seconda select contenente unicamente un’option, ovvero “scegli…“. Infine abbiamo un un elemento con id result nel quale alla fine inseriremo la scelta che è stata effettuata.
Creare il file con i parametri di connessione
Creaimo ora il file db_config.php che conterrà i parametri di connessione al database.
<!--?php $host = "localhost"; $user = "root"; $password = "*********"; $db = "selectExample"; ?-->
Naturalmente dovrai assegnare i parametri del tuo database.
Il file php per la gestione delle richieste
Iniziamo a questo punto a creare la classe PHP che avrà il compito di gestire l’elaborazione delle informazioni e di restituire i risultati. Il file si chiamerà select.class.php.
class SelectList
{
protected $conn;
public function __construct()
{
}
}
Iniziamo con il dichiarare la classe, in seguito la proprietà $conn che conterrà la risorsa di connessione al database, ed infine il metodo costruttore, che per il momento lasciamo vuoto.
Ora scriviamo il metodo per la connessione al database.
protected function DbConnect()
{
include "db_config.php";
$this->conn = mysql_connect($host,$user,$password) OR die("Impossibile connettersi al database");
mysql_select_db($db,$this->conn) OR die("Impossibile selezionare il database $db");
return TRUE;
}
Come vedi, dopo avere incluso i parametri procedo con la connessione e quindi con la selezione del database.
Ora procediamo con la creazione del metodo ShowCategory() che sarà responsabile di creare le option della prima select. Questo metodo verrà eseguito direttamente al caricamento della pagina, vedremo in seguito come.
public function ShowCategory()
{
$sql = "SELECT * FROM categorie";
$res = mysql_query($sql,$this->conn);
$category = 'scegli...';
while($row = mysql_fetch_array($res))
{
$category .= '' . $row['nome'] . '';
}
return $category;
}
Come puoi vedere eseguo una query che mi seleziona tutte le righe della tabella categorie. In seguito inserisco nella variabile $category la prima option, contenente un messaggio che invita l’utente ad effettuare una scelta. Infine aggiungo alla variabile $category tante option quante le voci presenti nella tabella, avendo cura di indicare come value l’id della categoria e come contenuto del tag option il nome stesso della categoria.
Ora passiamo a scrivere l’ultimo metodo che si occuperà di intercettare il valore passato dalla prima select (l’id della categoria) e di popolare la seconda in base al valore passato dalla prima
public function ShowType()
{
$sql = "SELECT * FROM tipo WHERE id_cat=$_POST[id]";
$res = mysql_query($sql,$this->conn);
$type = 'scegli...';
while($row = mysql_fetch_array($res))
{
$type .= '' . $row['nome'] . '';
}
return $type;
}
In questo caso tramite la query andremo a selezionare le righe della tabella tipo che hanno come id_cat il valore passato tramite POST (questo valore sarà passato con una chiamata ajax, ma non l’abbiamo ancora scritta, poi vedremo).
Il seguito è del tutto simile al metodo precedente.
Ora, visto che qualunque operazione svolga questa classe è necessaria la connessione al database, possiamo invocare il metodo DbConnect() direttamente nel metodo costruttore.
Inoltre possiamo, per comodità, instanziare la classe direttamente in questo file.
Ed ecco dunque la classe completa:
<!--?php class SelectList { protected $conn; public function __construct() { $this--->DbConnect();
}
protected function DbConnect()
{
include "db_config.php";
$this->conn = mysql_connect($host,$user,$password) OR die("Impossibile connettersi al database");
mysql_select_db($db,$this->conn) OR die("Impossibile selezionare il database $db");
return TRUE;
}
public function ShowCategory()
{
$sql = "SELECT * FROM categorie";
$res = mysql_query($sql,$this->conn);
$category = 'scegli...';
while($row = mysql_fetch_array($res))
{
$category .= '' . $row['nome'] . '';
}
return $category;
}
public function ShowType()
{
$sql = "SELECT * FROM tipo WHERE id_cat=$_POST[id]";
$res = mysql_query($sql,$this->conn);
$type = 'scegli...';
while($row = mysql_fetch_array($res))
{
$type .= '' . $row['nome'] . '';
}
return $type;
}
}
$opt = new SelectList();
?>
Ora torniamo a lavorare sul file principale (select.php)
Al momento che questo file viene caricato dovrà essere popolata la prima select. Lo faremo inserendovi il metodo ShowCategory() in questo modo:
<!--?php include "select.class.php"; ?--></pre> <form id="select_form">Scegli una categoria:
Come vedi, includiamo la classe già istanziata nell’oggetto $opt. In seguito, tra i tag select, stampiamo il risultato del metodo ShowCategory(), che saranno le option correttamente popolate con i valori presi dal database.
Puoi provare lo script e constatare che la prima select si popola correttamente.
Implementare le funzionalità ajax
Ora, quello che dobbiamo fare tramite jQuery è intercettare quanto verrà scelto in questa select ed inviare il dato (l’id della categoria) al metodo ShowType() che ci restituirà le option da inserire nella seconda select. Il tutto naturalmente con una chiamata ajax. Il codice (come sempre con jQuery è molto semplice) è il seguente (che va inserito nella funzione $(document).ready).
$("select#categorie").change(function(){
var id = $("select#categorie option:selected").attr('value');
$.post("select_type.php", {id:id}, function(data){
$("select#tipo").html(data);
});
});
Cosa significa? Al verificarsi dell’evento change nella select con id categorie, esegui questa funzione che:
- Valorizza la variabile id con l’attributo value dell’opzione selezionata.
- Invia tramite POST la variabile id al file select_type.php (che non abbiamo ancora scritto, ma lo faremo subito).
- Quanto restituito da questa chiamata inseriscilo nella select con id tipo.
Creare un file di servizio
Ovviamente il file select_type.php sarà un file di servizio che semplicemente invocherà il metodo ShowType().
<!--?php include "select.class.php"; echo $opt--->ShowType(); ?>
A questo punto puoi provare lo script. Ora selezionando una categoria, la seconda select si popolerà correttamente.
Migliorare l’usabilità
Adesso facciamo una piccola aggiunta. Ricordate la questione sull’usabilità esposta nel precedente articolo su ajax? Bene, credo che la seconda select vada disabilitata al caricamento della pagina. All’inizio della chiamata si potrebbe sostituire “scegli” con “attandere…”. Una volta che la chiamata è stata eseguita, la select può essere riabilitata. Questo é corretto dal punto di vista dell’usabilità. Modifichiamo dunque il codice in questo modo:
$(document).ready(function(){
$("select#tipo").attr("disabled","disabled");
$("select#categorie").change(function(){
$("select#tipo").attr("disabled","disabled");
$("select#tipo").html("attendere...");
var id = $("select#categorie option:selected").attr('value');
$.post("select_type.php", {id:id}, function(data){
$("select#tipo").removeAttr("disabled");
$("select#tipo").html(data);
});
});
Adesso non ci resta che stabilire cosa succede quando si preme su invia. Nel nostro caso scriveremo la scelta effettuata nell’elemento #result. Dovremo anche tenere conto (usabilità) di cosa dovrebbe succedere se il bottone invia viene premuto prima che siano state fatte tutte le scelte.
Questo è il codice che in seguito spiegherò
$("form#select_form").submit(function(){
var cat = $("select#categorie option:selected").attr('value');
var type = $("select#tipo option:selected").attr('value');
if(cat>0 && type>0)
{
var result = $("select#tipo option:selected").html();
$("#result").html('Hai scelto: '+result);
}
else
{
$("#result").html("Devi segliere le due opzioni!");
}
return false;
});
Al verificarsi dell’evento submit, prendiamo il valore dell’attributo value delle due select. Se questi valori sono entrambi maggiori a zero (quindi è stata fatta una scelta nelle due select), prendiamo il contenuto della select con id tipo e lo stampiamo nell’elemento #result.
Se invece non sono state fatte le due scelte, nell’elemento #result stampiamo il messaggio di errore.
Ecco select.php completo con tutte le modifiche.
<script type="text/javascript" src="jquery-1.3.2.js"></script><script type="text/javascript">// <![CDATA[
$(document).ready(function(){
$("select#tipo").attr("disabled","disabled");
$("select#categorie").change(function(){
$("select#tipo").attr("disabled","disabled");
$("select#tipo").html("<option>attendere...</option>");
var id = $("select#categorie option:selected").attr('value');
$.post("select_type.php", {id:id}, function(data){
$("select#tipo").removeAttr("disabled");
$("select#tipo").html(data);
});
});
$("form#select_form").submit(function(){
var cat = $("select#categorie option:selected").attr('value');
var type = $("select#tipo option:selected").attr('value');
if(cat>0 && type>0)
{
var result = $("select#tipo option:selected").html();
$("#result").html('Hai scelto: '+result);
}
else
{
$("#result").html("Devi segliere le due opzioni!");
}
return false;
});
});
// ]]></script>
<!--?php include "select.class.php"; ?--></pre>
<form id="select_form">Scegli una categoria:
Scegli un tipo:
<select> <option value="0">scegli...</option></select>
<input type="submit" value="conferma" /></form>
<pre>
Qui puoi scaricare un esempio dello script applicato alle regioni, province e comuni, uno dei casi più comuni di utilizzo di select concatenate.
Download
Conclusione
In questo articolo abbiamo visto un’applicazione di ajax molto utile e richiesta. Trattandosi di una funzionalità avanzata è chiaro che può risultare complessa a chi non ha una certa padronanza di php, ma d’altra parte non si può fare più semplicemente di così.
Bisogna comunque dire che, per una corretta applicazione dei criteri di accessibilità, dovremo prevedere una soluzione che permetta l’utilizzo di questo sistema, anche senza l’utilizzo di javascript (e quindi di jQuery).
E tu cosa ne pensi? Hai trovato questo articolo troppo complesso? Utilizzerai questi principi nei tuoi siti?
88 commenti
Trackback e pingback
-
PHP LEARN
[...] Ho scritto un’altro articolo su questo argomento, più approfondito e con un risultato più elegante. Puoi leggerlo su Your ... -
Sistema di prenotazione online autobus! - Pagina 2
[...] ogni volta modificare le pagine html delle varie destinazioni. Ti consiglio anche questo tutorial: QUI ... -
Select concatenate Regioni-Province-Comuni (con Variazione) - HTML, XML, CSS, Javascript
[...] [...] -
Modulo php - AlterVista | Spazio web gratis, hosting free php mysql
[...] [...] -
Estrazione dati da un db con un menu selezione in cascata
[...] dovrei tirare fuori i dati del prodotto completo. Cosa ho fatto: ho trovato la seguente guida http://www.yourinspirationweb.com/20...#comment-77518 ...





Non funziona la pagina di esempio
Grazie per la segnalazione popol, l’abbiamo corretta.
Chi è l’autore/autrice dei fantastici commenti?
Scusate ragazzi, ho sbagliato a scrivere.
Volevo dire “dei fantastici disegni”!!
E mi riferisco all’omino con il martello. :)
Scusate se ho risposto ad un commento….
…avrei dovuto crearne uno nuovo.
Scusate!
Tanquillo tranky. L’autrice è Sara
http://www.yourinspirationweb.com/autori/
Sara non me ne volere,
però tu parti avvantaggiata.
Saper disegnare ti da la possibilità di associare ai tuoi lavori anche i tuoi disegni, ottenendo così uno stile tutto tuo.
:(
Mannaggia alle mie dita…
molto molto interessante…mi era capitato poco tempo fa un problema uguale che poi ho risolto con una chiamata ajax! (peccato per le pagine di esempio!)
Ciao Jury e grazie.
I link alle pagine di esempio ora sono corretti. Non è la prima volta che mi succede che in anteprima funziona e poi il link risulta modificato.
Sono quasi certo che sia Nando a modificarli manualmente per farmi uno scherzo
Ciao, bell’articolo, ben fatto :-)
unica cosa, manca una chiamata ad una funzione clean prima di buttare il contenuto del $_POST[] nel db, occhio :-)
Non dare la colpa agli altri, e’ che un mese di ferie ti ha dato alla testa e ora sei tutto arrugginito :D
Ciao Sara!
Sì è un disastro, infatti come vedi rispondo ai commenti con un nuovo commento :-)
Ciao Joel e grazie.
puoi definiere meglio cosa intendi per funzione clean, credo di aver capito ma non sono certo.
Probabilmente si riferisce ad una “pulizia dei contenuti”, tuttavia non è questo argomento dell’articolo, che tra l’altro, è veramente esauriente.
Yep, una cosa simile, giusto per evitare qualche DROP TABLE da parte di qualche simpaticone:
function clean($x)
{
if (get_magic_quotes_gpc())
{
$x = stripslashes($x);
}
$x = mysql_real_escape_string($x);
return $x;
}
@1Dan Un minimo di sicurezza va sempre considerato, tanto più in questo caso che si tratta di un tutorial complesso (c’è anche un aumento di complessità dovuto alla strizzata d’occhio all’usabilità, molto importante).
Joel, abitualmente evito di accumulare troppe cose, in particolare in un articolo come questo. Non che la tua precisazione non sia corretta, ma aggiungere quel codice mi avrebbe costretto a spiegarlo, allungando un articolo già lungo e saltando da un argomento all’altro. Chiaramente è un’impostazione discutibile come sono discutibili altre scelte che faccio.
Nella fattispecie non “scomoderei” mysql_real_escape_string. Visto che l’unico dato che viene inviato in POST è l’id, basterà un semplice
(int)$_POST['id']
:-)
Sono d’accordo con joel sul fatto che la sicurezza non va mai trascurata nemmeno in articoli prolissi e complessi come questo. E sono d’accordo anche con maurizio, visto che si passa un semplice [id] che deve contenere un valore numerico basta semplicemente renderlo un intero mediante la funzione int().
Beh ovviamente ognuno sceglie l’impostazione che preferisce ;-) io l’ho segnalato dato che oltre all’esempio c’era anche una risorsa completa (quella regioni/province/città). E’ probabile che venga buttata dentro il server così com’è, senza personalizzazioni :-)
Si, anche int() fa il suo lavoro, ignorando gli apici. Io sono un po’ paranoico e scomodo sempre mysql :P
Bravo Maurizio,
Un articolo ben fatto, spiegato molto bene e chiaramente. Io ne ho fatte tante di select concatenate ma preferisco passare un oggetto json e poi popolare le option nella funzione di ritorno.
Sicuramente interessante l’onchange che hai messo nel document ready.
Ciao Luca e grazie.
La soluzione json è certamente migliore e più razionale.
Didatticamente preferisco questa forma, meno razionale, più prolissa ma anche più esplicativa
O_O cioè va, ma come si fa a non leggere sto blog???????
dove diavolo si trova una community così simpatica (vedi il basilico di maurizio XD ) e disponibile, e che sforna articoli del genere?????
YIW 4EVER U_U
Ciao Caluk.
Guarda che la storia del basilico…insomma…tutti se la ridono, ma in realtà per me è una grande frustrazione. sono in psicoterapia da due anni
azz, volevo farti uno scherzo con le tue piantine, ma visto che sei in psicoterapia nn lo faccio U_U
XD XD
Ragazzi scusate,
utilizzare un code highlighter in javascript non vi sembrerebbe qualcosa da prendere in considerazione per i vostri articoli?
Ce n’è di molto carini.
Ve ne posto uno:
http://alexgorbatchev.com/SyntaxHighlighter/
E questi sono i linguaggi che supporta:
http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/
Scusate ragazzi, non so per quale motivo ma non vi aveva caricato l’highlight del codice.
Fate finta che non abbia scritto nulla.
E siamo a 2.
Tranky, ti comunico che sei in castigo fino alla pubblicazione del prossimo articolo :-)
Io l’avevo realizzato per un progetto, di sicuro la tua versione è più pulita :D
Cmq non per fare il “grammar nazi” c’è un errore di “stumpa” nel capitolo <>: attandere al posto di attendere
Lo so, lo so, era per vedere se siete attenti :-)
mazzoje guadagna un credito
Ciao, girando per trilioni di forum e tutorial ho trovato questa pagina, e ho finalmente realizzato questi benedetti menu, ma a me nn è chiara una cosa:
while($row = mysql_fetch_array($res))
{
$category .= ” . $row['nome'] . ”;
}
return $category;
}
Sto return $category dopo il while fa apparire solo l’ultima riga letta dalla tabella, io devo fare l’echo ogni volta, succede solo a me?
supponendo che tutto il codice che manca se lo sia mangiato il parser.
Sei certa di avere messo i punto prima dell’uguale
$category .=
No io sono certa di nn averlo messo il punto :D
Veramente il php già ce l’avevo quindi ho sostituito con il mio codice e andava lo stesso, era il javascript il problema, ho trovato script così lunghi k mi passava la voglia di leggerli.
Comunque complimenti per l’articolo.
Ciao Maurizio e grazie per la risorsa ed il tempo che metti a disposizione .
Volevo chiederti come mai a me compare subito questo errore sia con il copia e incolla che con il file scaricato?
Parse error: parse error, expecting `T_OLD_FUNCTION’ or `T_FUNCTION’ or `T_VAR’ or `’}” in c:\program files\easyphp1-8\www\select\select.class.php on line 13
Ciao michele.
Il mondo va avanti ed insieme ad esso le versioni degli interpreti di PHP.
La classe è scritta con una sintassi compatibile con PHP 5.x .
Visto che stai lavorando in locale, non avrai certamente difficoltà ad aggiornarti a PHP 5. Fatto questo lo script inizierà a funzionare correttamente.
Salve a tutti e complimenti per l’ottimo articolo.
L’ho subito modificato creando una struttura del tipo “continente-nazioni-regioni-province”.
Sono rimasto perplesso su alcune cose:
1) se clicco su conferma mi dà sempre errore eppure i dati sono inseriti correttamente. se infatti disabilito l’if, mi vengono stampati bene tutti i dati. A mio parere è come se non riuscisse ad impostare il “value” col dato che gli passo;
2) vorrei sapere come fare a “svuotare” il contenuto di ogni select ogni volta che viene cambiata la sua select “madre” perchè è vero che ho aggiunto il “disabled” per ogni cambio select, ma non riesco a svuotarne il contenuto.
3) è normale che se scelgo tutte le select (fino all’ultima) e guardo nel sorgente della pagina, tutte le select sono vuote?
grazie.
Ciao Webby
1. Sono un po’ arrugginito con le mie capacità telepatiche :-)
se non dici che errore si verifica e che if disabiliti (ce ne saranno almeno 20 tra javascript e php) non vedo come potrei indovinare. In ogni caso, certamente hai un erore nel codice
2. Quello che chiedi è esattamente quello che fanno i due esempi proposti ed è spiegato nel dettaglio nell’articolo
3. Sì, è normale. Visualizzando il sorgente pagina, viene visualizzato il sorgente della pagina inviata. Ma poi viene modificata con jQuery.
Se vuoi visualizzare il sorgente generato, dovrai installare un plugin tipo “web developper” per FF.
Ciao,
mi scuso per essere stato poco chiaro. Allora:
1) mi riferisco all’unico if presente nel codice javascript: quello che verifica se le due variabili sono >0. In pratica mi esce l’errore che dice di selezionare 2opzioni e invece sono tutte selezionate. A mio parere è come se non aggiornasse il value del option;
2) provo a spiegarmi meglio anche qui. Se io scelgo un continente, poi una nazione e poi una regione e cambio di nuovo il continente, è vero che tutte le select successive (figlie) al continente vengono disabilitate ma non vengono svuotate cioè non vengono ripristinate allo stato iniziale.
1. C’é un errore ma non so dirti dove. Posso provare ad ipotizzare un diverso nome delle variabili
2. E’ chiaro che c’é un errore. Ricontrolla attentamente il codice
ciao Maurizio, innanzitutto grazie perchè il tuo esempio é stato molto chiaro.
ho una domanda da porti.
é possibile, una volta eseguita l’ultima select ed aver ottenuto la risposta, associare ad ogni comune un file da scaricare (o un link da aprire) ?
scusa ma sono una capra :)
Ciao complimenti per l’articolo, ma avrei qualche domanda da fare, io uso wordpress e sto cercando di aggiungere al modulo contatti l’opzione che mi fa scegliere la citta la provincia ecc.. proprio come hai spiegato bene tu nell’articolo. Ho scaricato quindi tutto il pacchetto script applicato alle regioni, province e comuni, ma non ho capito bene dove devo mettere tutti quei file che si trovano nell’archivio .zip . Mi daresti una mano su dove inserire i file? te ne sarei molto grato se tu mi rispondessi al più presto possibile. Grazie ancora e complimenti per il tuo blog!
Ciao ragazzi, ho bisogno del vostro aiuto.. è possibile integrare il pacchetto dello script con il plugin contact form di wordpress? mi dareste una mano? grazie a tutti!
Complimenti a tutti per gli articoli, anzi i servizi! meglio di qualsiasi manuale.
Anche se sono ancora molto indietro con php e jquery, sto provando ugualmente a sbatterci le corna! L’esempio a cascata regioni, province molto bello, utilissimo ma…molto tosto da capire! Accidenti! non riesco nemmeno ad intercettare la scelta effettuata, provo in un secondo form a leggere il $_POST della select regioni, province
$regione =$_POST['id_reg']; NULLO, provo anche nel Select.php a scrivere in un file, per capire cosa legge:
if(isset($_POST['id_reg']))
{
echo $opt->ShowProvince();
$fileout=”selezione.txt”;
$file_txt=@fopen($fileout,”w+”);
@fwrite($file_txt, “selezionato :$_POST[id_reg']\n”);
@fclose($file_txt);
die;
}
File pulito !
Ma cosa è che non riesco a capire?
Mi date una mano?
Ciao Marco.
Difficile risponderti. Se hai usato esattamente lo stesso codice proposto in questo articolo, il tutto dovrebbe funzionare senza problemi (gli esempi linkati nell’articolo sono realizzati con il codice che trovi nel pacchetto da scaricare, e come puoi vedere funzionano).
Ammiro l’intraprendenza, ma se non hai una certa esperienza con PHP MySql e jQuery é davvero dura.
Comunque, se hai modificato qualcosa, il problema sarà li. Ma ti consiglio di postare sul forum in questi casi (mi sembra che ci sia già una discussione su questo articolo); almeno nel forum ci sono i tag per postare il codice
Ciao Maurizio, grazie per la risposta, mi spiego meglio, il tutto funziona a meraviglia, ho aggiunto però, una pagina, dopo il submit la rimando a “ulteriori.php” qui se leggo $_POST['id_reg'] trovo regolarmente ID della regione, ma la mia perplessità sta nel fatto che non c’e’ modo di far leggere in $_POST la select che ha il nome della regione, se leggo $_POST['regioni'] mi dice ,infatti che ‘regioni’ non è definito!
Selezionando ‘lombardia’ mi restituisce ID_reg=11 ma non riesco a trovarmi con il nome da nessuna parte. Quindi sono costretto con il codice a ripescarmi il nome da tabella sql.
Cosa è che non capisco?
E si, ma perché viene passato il value. Se vuoi passare il contenuto devi modificare in modo che passi quello
Ciao a tutti!!
Volevo sapere perchè a me l’esempio delle REGIONI,PROVINCE non funziona!!!!ho creato le table in mysql e tutto dovrebbe funzionare..ma non va!!compaiono le caselle di selezione della regione ma sono vuote!perchè?!..premetto anche che io, per tutte le connessioni, ho utilizzato il comando
$mysqli = @mysqli_connect(“xxx”, “xxx”, “xx”, “x”)
e premetto anche che sono alle prima armi con php!!conosco asp ma volevo imparare php…
beh, difficile dire perché non funziona…
posso comunque dire tre cose:
1) il codice mostrato nell’articolo é uguale a quello contenuto nel file da scaricare ed uguale a quello utilizzato per gli esempi, dunque funziona.
2) mysqli era partito con le migliori intenzioni ma poi si é arenato. Non lo usa nessuno e ci sarà un perché :-)
3) questo non é un articolo dei migliori per imparare php, é un po’ tanto complesso, inizierei da qualcosa di più semplice
Errore mio!!o meglio..ero convinto di dover lavorare SOLO con mysqli e lo facevo con quello..usando semplicemente mysql è tutto ok!!!Grazie mille
questo sito è davvero una manna dal cielo…complimenti! :D
A nome di tutti ti ringrazio Marco
Tutorial interessante, grazie.
Mi serviva come base per realizzare un sistema di ‘filtri’ parametrico, basato su categorie nidificate, quindi senza sapere a priori quante select ci sono (lo sto estendendo per gestire anche il caso in cui le si voglia stabilire a priori (giusto solo perchè ovviamente nel primo caso si vede solo la prima select e le altre create al volo via ajax, mentre nel secondo le select vengono create subito (più simile a questo tutorial)).
Ritengo anch’io utile il rilievo di Joel in merito alla sicurezza. Si potrebbe poi aggiungere anche una considerazione sul namespace e il modo di evitare conflitti tra diverse librerie js e così via. (Sono co-mantainer della community italiana di un progetto os e mi scontro ogni tre per due con codice preso e copiato brutalmente, con problemi di sicurezza e di compatibilità) .
Come giustamente obietta Maurizio non si possono sviscerare tutti questi aspetti in un tutorial incentrato su un argomento ben specifico.
Però magari si possono inserire ad esempio a fine articolo 3/4 reminder relativi alle best practices più comuni inerenti al codice trattato nell’articolo.
Se poi questi reminder sono link a risorse sull’argomento meglio ancora. Se poi queste sono ‘interne’ (a YWB) è il massimo.
Si potrebbe ‘costruire’ un repository di best practices (scusate gli inglesismi ma mi viene più semplice) a cui attingere ogni volta che si scrive un articolo, in modo da dare il maggior numero possibile di info e non dover ripetere ogni volta le info di base.
In questo caso si sarebbero potute aggregare (avendole a disposizione) best practices su
- oop
- connessione a db
- recupero record
- sanitizzazione php/mysql
- intro a jquery
- Jquery noconflict
…
Scusate se ho travalicato i confini. Il mio vuol essere un semplice ‘sarebbe bello se…’, nella speranza che possa essere utile.
Ciao utilissimo tutorial,
avrei una domanda abbastanza vitale: come posso stampare a video il risultato delle select del form generato?
Mi spiego ad esempio: stampami tutti i record che hanno la regione = al valore della select regione, la provincia = al valore della select provincia e comune = al valore della select comune?
Sto provando a riaddatare il tutorial su un unico db di registrazioni, le select vanno a buon fine ma ora vorrei visualizzare il risultato finale di queste select.
pensavo ad un button sempre nel form, ma qualsiasi altra cosa è ben accetta visto che ora brancolo nel buio.
mi potreste dare qualche dritta?
vi ringrazio in anticipo, e continuate cosi bellissimo blog
Molto utile! E tutto molto chiaro! Grazie!
Grazie Matteo
Complimenti all’autore! bello, chiaro e perfettamente funzionante, solo due punti.
Provato in locale và che è una bellezza, se però rientri nella stessa pagina bisogna azzerare le variabili, altrimenti tiene in memoria l’ultima selezione.
Su un server remoto è lentissimo, non ho ancora capito perchè, dopo aver selezionato la regione, prima di elencate le province ci impega molto tempo.
Merita un approfondimento sulla velocità di risposta!
Complimenti davvero molto utile.
Ciao marco.
La velocità dipende dal server. Se si tratta di un hosting economico é probabile che lo stesso database sia utilizzato per moltissimi siti; così le query si devono incolonnare ed attendere il loro turno.
Ciao..
Molto interessante e utile.. complimenti! :)
l’unica cosa che mi risulta strana è il comportamento dello script con i vari browser…
Con Firefox tutto fila… con Safari invece le select rimangono vuote..
Hai qualche suggerimento?
Grazie mille,
Vincenzo
Ho provato ora la pagina di esempio con Safari e funziona, quindi non so cosa rispondere
SPETTACOLARE!!!!
HO capito molto di più con questo articolo che con il libro su jquery :-)
G R A Z I E !!!!
Grazie Gianpiero!
ciao a tutti!
Grazie e complimenti per l’articolo è stato davvero utile!
premetto che mi sono avvicinato da poco a javascript, vorrei farvi una domanda(probabilmente molto stupida).
ho scaricato il download per concatenare le città-province-regioni e al suo interno c’è questo file jquery-1.3.2, che fa funzionare il tutto. vorrei sapere a cosa serve, cos’è e perchè senza non funziona?
grazie e scusate per l’ignoranza
Ciao Luca.
jQuery é un framework javascript e come tutti i framework permette di svolgere procedure altrimenti complesse in modo semplice e sistematico.
Chiaramente se non lo includo, vengono a mancare queste procedure ed il motore di javascript non può interpretarle
Ho scaricato il pacchetto di esempio, solo che sto usando jquery-1.7.1.min.js con jquery mobile.
Perché se sostituisco jquery 1.3.2 con jquery 1.7.1 non funziona?
grazie….
Scusate, funziona… solo che non si prende i fogli di stile di jquery mobile… da cosa può essere dipeso?
Grazie mille per la risposta!
ora ho un altra domanda da fare.
Ho notato che si sta parlando tantissimo di HTML5. Io sto iniziando a studiarlo (senza aver studiato xhtml) ma mi sto chiedendo: se ora dovessi fare un sito mi converrebbe farlo in html5?
A livello di doctype sì. Molti siti lo fanno, anche yiw.
Non utilizzerei invece le caratteristiche specifiche di html5 in quanto sono supportate unicamente (e solo in parte) dai browser di ultima generazione.
Mi domanderai allora a cosa serve dichiarare un doctype html5 e poi scrivere in html4.
Io lo faccio per poter utilizzare delle caratteristiche particolari ed innocue se non supportate.
Ad esempio in un campo input posso dichiarare type=”email”.
Se non é supportato verrà letto come un normale campo di testo, ma su un iPhone, entrando in quel campo, comparirà la tastiera specifica per l’email (con la @ e il punto) come ho descritto in questo articolo
http://www.yourinspirationweb.com/2011/04/21/spunti-su-come-ottimizzare-un-sito-web-per-dispositivi-mobili/
Quindi alcune caratteristiche, con parsimonia, possiamo iniziare ad utilizzarle.
Segnalo comunque a Nando questa tua domanda che ne sa molto più di me.
@Maurizio grazie mille! sono davvero stupito della disponibilità tua e di tutti i collaboratori del sito! grazie ancora!
ciao maurizio, se fosse possibile vorrei contattarti in privato.
se puoi mandami una mail cosi posso risponderti a quel indirizzo.
grazie
a presto
Ciao Maurizio..
Grazie per il fantastico articolo.. era proprio quello che mi serviva.
Però mi è uscito un piccolo problema magari tu mi puoi essere d’aiuto.
Il tuo codice l’ho messo in una pagina php che viene poi richiamata all’interno di un form per fare la select concatenata e fin qui tutto perfetto
il problema sorge quando io vado a richiamare i dati che ho salvato nel form:
ho messo un pulsate nel dove piazzo la select coi dati salvati in modo che se volessi cambiare la mia selezione , tramite ajax mi va a caricare nuovamente il file php con il tuo codice..
il problema sta nel fatto che sembra che il codice non riesca ad andare oltre la prima selezione e non riesca a fare la seconda senza però generate errori..
forse così è molto dura da capire.
però se hai voglia di darci un’occhio ti invio il codice.
te ne sarei infinitamente grato :)
Andrea
Buon giorno, ho modificato le pagine per il mio database, composto da 4 tabelle regione, province,comuni e cap.
Funzionava.
Poi ho iniziato a modificarlo, in modo da avere 2 serie di select concatenate (mittente e destinatario). Qui iniziano i problemi, ad ora funziona una serie di select (quella che ho lasciato invariato eccetto le parti riguardanti al database (adattato al mio).
Invece la seconda serie di select per il destinatario, funziona fino ad attivarsi l’ultima select.
Si attiva, ma non ci sono comuni.
————————————–
INDEX.PHP
$(document).ready(function(){
var scegli = ‘Scegli…’;
var attendere = ‘Attendere…’;
$(“select#province”).html(scegli);
$(“select#province”).attr(“disabled”, “disabled”);
$(“select#comuni”).html(scegli);
$(“select#comuni”).attr(“disabled”, “disabled”);
$(“select#regioni”).change(function(){
var regione = $(“select#regioni option:selected”).attr(‘value’);
$(“select#province”).html(attendere);
$(“select#province”).attr(“disabled”, “disabled”);
$(“select#comuni”).html(scegli);
$(“select#comuni”).attr(“disabled”, “disabled”);
$.post(“select.php”, {id_reg:regione}, function(data){
$(“select#province”).removeAttr(“disabled”);
$(“select#province”).html(data);
});
});
$(“select#province”).change(function(){
$(“select#comuni”).attr(“disabled”, “disabled”);
$(“select#comuni”).html(attendere);
var provincia = $(“select#province option:selected”).attr(‘value’);
$.post(“select.php”, {id_pro:provincia}, function(data){
$(“select#comuni”).removeAttr(“disabled”);
$(“select#comuni”).html(data);
});
});
//e DUEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
$(“select#prodes”).html(scegli);
$(“select#prodes”).attr(“disabled”, “disabled”);
$(“select#comdes”).html(scegli);
$(“select#comdes”).attr(“disabled”, “disabled”);
$(“select#regdes”).change(function(){
var regione = $(“select#regdes option:selected”).attr(‘value’);
$(“select#prodes”).html(attendere);
$(“select#prodes”).attr(“disabled”, “disabled”);
$(“select#comdes”).html(scegli);
$(“select#comdes”).attr(“disabled”, “disabled”);
$.post(“select.php”, {id_reg:regione}, function(data){
$(“select#prodes”).removeAttr(“disabled”);
$(“select#prodes”).html(data);
});
});
$(“select#prodes”).change(function(){
$(“select#comdes”).attr(“disabled”, “disabled”);
$(“select#comdes”).html(attendere);
var provincia = $(“select#provdes option:selected”).attr(‘value’);
$.post(“select.php”, {id_pro:provincia}, function(data){
$(“select#comdes”).removeAttr(“disabled”);
$(“select#comdes”).html(data);
});
});
});
……
DESTINATARIO
RegioniDEST(); ?>
Seleziona una provincia:
Scegli…
Seleziona un comune:
Scegli…
——————
SELECT.PHP
ShowProvince();
die;
}
if(isset($_POST['id_pro']))
{
echo $opt->ShowComuni();
die;
}
if(isset($_POST['id_reg']))
{
echo $opt->ProvinceDEST();
die;
}
if(isset($_POST['id_pro']))
{
echo $opt->ComuniDEST();
die;
}
?>
—————————–
SELECT.CLASS.PHP
DbConnect();
}
protected function DbConnect()
{
include “db_config.php”;
$this->conn = mysql_connect($host,$user,$password) OR die(“Impossibile connettersi al database”);
mysql_select_db($db,$this->conn) OR die(“Impossibile selezionare il database $db”);
return TRUE;
}
public function ShowRegioni()
{
$sql = “SELECT * FROM regioni”;
$res = mysql_query($sql,$this->conn);
$regioni = ‘scegli…’;
while($row = mysql_fetch_array($res))
{
$regioni .= ” . utf8_encode($row['regione']) . ”;
}
return $regioni;
}
public function ShowProvince()
{
$sql = “SELECT * FROM province WHERE cod_regione=$_POST[id_reg]“;
$res = mysql_query($sql,$this->conn);
$province = ‘scegli…’;
while($row = mysql_fetch_array($res))
{
$province .= ” . utf8_encode($row['provincia']) . ”;
}
return $province;
}
public function ShowComuni()
{
$sql = “SELECT * FROM comuni WHERE cod_provincia=$_POST[id_pro]“;
$res = mysql_query($sql,$this->conn);
$comuni = ‘scegli…’;
while($row = mysql_fetch_array($res))
{
$comuni .= ” . utf8_encode($row['comune']) . ”;
}
return $comuni;
}
// E DUEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
public function RegioniDEST()
{
$sql = “SELECT * FROM regioni”;
$res = mysql_query($sql,$this->conn);
$regdes = ‘scegli…’;
while($row = mysql_fetch_array($res))
{
$regdes .= ” . utf8_encode($row['regione']) . ”;
}
return $regdes;
}
public function ProvinceDEST()
{
$sql = “SELECT * FROM province WHERE cod_regione=$_POST[id_reg]“;
$res = mysql_query($sql,$this->conn);
$prodes = ‘scegli…’;
while($row = mysql_fetch_array($res))
{
$prodes .= ” . utf8_encode($row['provincia']) . ”;
}
return $prodes;
}
public function ComuniDEST()
{
$sql = “SELECT * FROM comuni WHERE cod_provincia=$_POST[id_pro]“;
$res = mysql_query($sql,$this->conn);
$comdes = ‘scegli…’;
while($row = mysql_fetch_array($res))
{
$comdes .= ” . utf8_encode($row['comune']) . ”;
}
return $comdes;
}
———————
Non riesco a capire perchè l’ultimo select del destinatario (comune) non funziona.
Dopo dovrei aggiungere la quarta select dipendente per entrambe le “serie”, per la scelta del cap.
Buon giorno Sono riuscito :) nn ho più bisogno, grazie!!
Posto i file modificati. Per chi come me ha bisogno di usarne 2 serie concatenate di 4 select
(il mio db è diverso, 4 tabelle regioni province comuni e cap; credo sia meglio, per quei comuni come Napoli Milano che hanno più cap)
Premetto che funziona, ma non so se sia corretto al 100%.
—————————-
SELECT.php
ShowProvince();
die;
}
if(isset($_POST['id_pro']))
{
echo $opt->ShowComuni();
die;
}
if(isset($_POST['id_com']))
{
echo $opt->ShowCap();
die;
}
if(isset($_POST['id_reg']))
{
echo $opt->ProvinceDEST();
die;
}
if(isset($_POST['id_pro']))
{
echo $opt->ComuniDEST();
die;
}
if(isset($_POST['id_com']))
{
echo $opt->CapDEST();
die;
}
?>
————————————————————–
SELECT.CLASS.php
DbConnect();
}
protected function DbConnect()
{
include “db_config.php”;
$this->conn = mysql_connect($host,$user,$password) OR die(“Impossibile connettersi al database”);
mysql_select_db($db,$this->conn) OR die(“Impossibile selezionare il database $db”);
return TRUE;
}
public function ShowRegioni()
{
$sql = “SELECT * FROM regioni”;
$res = mysql_query($sql,$this->conn);
$regioni = ‘scegli…’;
while($row = mysql_fetch_array($res))
{
$regioni .= ” . utf8_encode($row['regione']) . ”;
}
return $regioni;
}
public function ShowProvince()
{
$sql = “SELECT * FROM province WHERE cod_regione=$_POST[id_reg]“;
$res = mysql_query($sql,$this->conn);
$province = ‘scegli…’;
while($row = mysql_fetch_array($res))
{
$province .= ” . utf8_encode($row['provincia']) . ”;
}
return $province;
}
public function ShowComuni()
{
$sql = “SELECT * FROM comuni WHERE cod_provincia=$_POST[id_pro]“;
$res = mysql_query($sql,$this->conn);
$comuni = ‘scegli…’;
while($row = mysql_fetch_array($res))
{
$comuni .= ” . utf8_encode($row['comune']) . ”;
}
return $comuni;
}
//CAP capiiiiii
public function ShowCap()
{
$sql = “SELECT * FROM cap WHERE comune=’$_POST[id_com]‘”;
$res = mysql_query($sql,$this->conn);
$cap = ‘scegli…’;
while($row = mysql_fetch_array($res))
{
$cap .= ” . utf8_encode($row['cap']) . ”;
}
return $cap;
}
// E DUEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
public function RegioniDEST()
{
$sql = “SELECT * FROM regioni”;
$res = mysql_query($sql,$this->conn);
$regdes = ‘scegli…’;
while($row = mysql_fetch_array($res))
{
$regdes .= ” . utf8_encode($row['regione']) . ”;
}
return $regdes;
}
public function ProvinceDEST()
{
$sql = “SELECT * FROM province WHERE cod_regione=$_POST[id_reg]“;
$res = mysql_query($sql,$this->conn);
$prodes = ‘scegli…’;
while($row = mysql_fetch_array($res))
{
$prodes .= ” . utf8_encode($row['provincia']) . ”;
}
return $prodes;
}
public function ComuniDEST()
{
$sql = “SELECT * FROM comuni WHERE cod_provincia=$_POST[id_pro]“;
$res = mysql_query($sql,$this->conn);
$comdes = ‘scegli…’;
while($row = mysql_fetch_array($res))
{
$comdes .= ” . utf8_encode($row['comune']) . ”;
}
return $comdes;
}
//Cap dest
public function CapDEST()
{
$sql = “SELECT * FROM cap WHERE comune=’$_POST[id_com]‘”;
$res = mysql_query($sql,$this->conn);
$capdes = ‘scegli…’;
while($row = mysql_fetch_array($res))
{
$capdes .= ” . utf8_encode($row['cap']) . ”;
}
return $capdes;
}
}
?>
——————————————————————————————
INDEX.php
Regioni, province, comuni | Your Inspiration Web
$(document).ready(function(){
var scegli = ‘Scegli…’;
var attendere = ‘Attendere…’;
//uno
$(“select#province”).html(scegli);
$(“select#province”).attr(“disabled”, “disabled”);
$(“select#comuni”).html(scegli);
$(“select#comuni”).attr(“disabled”, “disabled”);
//PROVA CAP
$(“select#cap”).html(scegli);
$(“select#cap”).attr(“disabled”, “disabled”);
// CAP DEST
$(“select#capdes”).html(scegli);
$(“select#capdes”).attr(“disabled”, “disabled”);
//e DUEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
$(“select#prodes”).html(scegli);
$(“select#prodes”).attr(“disabled”, “disabled”);
$(“select#comdes”).html(scegli);
$(“select#comdes”).attr(“disabled”, “disabled”);
//uno
$(“select#regioni”).change(function(){
var regione = $(“select#regioni option:selected”).attr(‘value’);
$(“select#province”).html(attendere);
$(“select#province”).attr(“disabled”, “disabled”);
$(“select#comuni”).html(scegli);
$(“select#comuni”).attr(“disabled”, “disabled”);
//aggiunta per il cap
$(“select#cap”).html(scegli);
$(“select#cap”).attr(“disabled”, “disabled”);
$.post(“select.php”, {id_reg:regione}, function(data){
$(“select#province”).removeAttr(“disabled”);
$(“select#province”).html(data);
});
});
//da correggere per province
$(“select#province”).change(function(){
var provincia = $(“select#province option:selected”).attr(‘value’);
$(“select#comuni”).html(attendere);
$(“select#comuni”).attr(“disabled”, “disabled”);
$(“select#cap”).html(scegli);
$(“select#cap”).attr(“disabled”, “disabled”);
$.post(“select.php”, {id_pro:provincia}, function(data){
$(“select#comuni”).removeAttr(“disabled”);
$(“select#comuni”).html(data);
});
});
//da corregere per il cap
$(“select#comuni”).change(function(){
$(“select#cap”).attr(“disabled”, “disabled”);
$(“select#cap”).html(attendere);
var comune = $(“select#comuni option:selected”).attr(‘value’);
$.post(“select.php”, {id_com:comune}, function(data){
$(“select#cap”).removeAttr(“disabled”);
$(“select#cap”).html(data);
});
});
//Destinatario
$(“select#regdes”).change(function(){
var regione = $(“select#regdes option:selected”).attr(‘value’);
$(“select#prodes”).html(attendere);
$(“select#prodes”).attr(“disabled”, “disabled”);
$(“select#comdes”).html(scegli);
$(“select#comdes”).attr(“disabled”, “disabled”);
$.post(“select.php”, {id_reg:regione}, function(data){
$(“select#prodes”).removeAttr(“disabled”);
$(“select#prodes”).html(data);
});
});
//da correggere per province destinatario
$(“select#prodes”).change(function(){
var provincia = $(“select#prodes option:selected”).attr(‘value’);
$(“select#comdes”).html(attendere);
$(“select#comdes”).attr(“disabled”, “disabled”);
$(“select#capdes”).html(scegli);
$(“select#capdes”).attr(“disabled”, “disabled”);
$.post(“select.php”, {id_pro:provincia}, function(data){
$(“select#comdes”).removeAttr(“disabled”);
$(“select#comdes”).html(data);
});
});
//da corregere per il cap destinatario
$(“select#comdes”).change(function(){
$(“select#capdes”).attr(“disabled”, “disabled”);
$(“select#capdes”).html(attendere);
var comune = $(“select#comdes option:selected”).attr(‘value’);
$.post(“select.php”, {id_com:comune}, function(data){
$(“select#capdes”).removeAttr(“disabled”);
$(“select#capdes”).html(data);
});
});
});
La cascata regioni – province – comuni
Seleziona una regione e nella select successiva compariranno le province di quella regione
Selezionando una provincia, nella select successiva compariranno i comuni di quella provincia
Seleziona una regione:
ShowRegioni(); ?>
Seleziona una provincia:
Scegli…
Seleziona un comune:
Scegli…
Seleziona cap:
Scegli…
DESTINATARIO
RegioniDEST(); ?>
Seleziona una provincia:
Scegli…
Seleziona un comune:
Scegli…
Seleziona cap:
Scegli…
Ciao, tutorial molto interessante.
Vorrei modificare lo script in base alle mie esigenze ma non mi funziona.
Modifico la classe cambiando la query sql della function ShowRegioni() con i riferimenti al mio db e fin qui tutto ok.
Quando modifico la seconda function ShowProvince(), il select non viene popolato.
Questo è il codice della query:
$sql = “SELECT * FROM marche WHERE Marca=’”.$_POST['Marca'].”‘”;
$_POST['Marca'] è il valore preso dalla prima select.
Come posso fare per farla funzionare?
Ciao Maurizio,
premetto che non sono un grande esperto di php, sql, jquery ecc.
Ad ogni modo sto provando ad usare Drupal (in locale) e vorrei inserivi dei form con select a cascata. Ho usato il tuo zip per regioni-province-comuni. La connessione al DB avviene regolarmente e mi viene visualizzata in una pagina Drupal la serie di regioni. Effettuando al scelta non succede tuttavia niente. Inoltre ottengo i seguenti errori (prima ancora di effetturare la selezione):
Notice: Undefined index: id_reg in SelectList->ShowProvince() (line 42 of C:\…\…\…\acquia-drupal\modules\php\select.class.php).
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in SelectList->ShowProvince() (line 46 of C:\…\…\…\acquia-drupal\modules\php\select.class.php).
E’chiaro che la variabile selezionata id_reg non viene passata alla funcion ShowProvince. Hai idea di cosa possa essere? Che tu sappia ci sono problemi di funzionamento con Drupal?
Grazie
Ciao
Angelo
Salve, ho un problema con una pagina php dove ho 3 select distinte e separate. Quando si seleziona il valore dalle select devo evitare il refresh della pagina altrimenti mi azzera tutte le variabili. I tre valori selezionati insieme ad altri mi servono per eseguire un’istruzione sql.
Ho provato ad impostare una chiamata Ajax ma senza successo (non ho tanta esperienza con jquery e ajax)
$(“select#mese”).change(function(){
var periodo = $(“#mese”).val();
$.ajax({
url: ‘mese.php’,
dataType: “html”,
success: function(data){
$(“div#risultato”).html(data.periodo);
}
});
return false;
});
La richiesta alla pagina mese.php non arriva.
Non riesco a capire dove sbaglio.
Ho scritto stamane e dopo tante prove, modificando la chiamata ajax, finalmente sono riuscito a estrapolare il valore dalle select e viene stampato correttamente a video. Mi chiedo se sia possibile assegnare il suddetto valore ad una variabile php per eseguire una query sql che vada ad aggiornare il database.
Grazie in anticipo.
Ciao
Si può implementare questa funzione in “Drupal” con i filtri esposti di una View ?
Grazie
Ciao a tutti!
articolo molto interessante, sicuramente lo applicherò al progetto a cui sto lavorando (un bel gestionale per le spese domestiche :-))
ho due problemi
1. non riesco a visualizzare bene il codice presente nella pagina. ad esempio nella funzione ShowCategory, la riga di concatenazione la vedo così: $category .= ” . $row['nome'] . ”;
e quindi mi perdo la parte importante della funzione ;-)
ma questo non è l’unico punto… non vorrei che fosse un problema di interazione con il SyntaxHighlighter..
per poter capire l’articolo ho “dovuto” scaricare la risorsa e fare il parallelo con il tutorial
2. anche la versione pdf dell’articolo ha dei problemi di visualizzazione del codice. esempio tipico: il codice iniziale del file select.class.php è visualizzato così:
Arrayclass SelectListArray{Array protected $conn;ArrayArray
public function __construct()ArrayArray
{ArrayArray }Array}Array
test fatti su XP con explorer7, chrome18 e firefox7, su linux con firefox3.6 (questo passa il convento, in azienda..)
succede solo a me? :-( :-(
grazie
Carlo
Ciao, intanto complimenti per l’articolo!! Molto ben fatto e interessante!
L’unico problema che ho riscontrato – già citato da Carlo – è stato con gli script nella pagina e nel pdf scaricato .. ma ho risolto anche io guardando la risorsa su regioni province e comuni.
È stato un po’ un casino adattare gli script al componente di joomla che sto sistemando ma ne è valsa la pena!!
Complimenti ancora!
Micol
Ciao, io i complimenti li faccio per il sito… ricco di informazioni.
E adesso passiamo alla domanda :)
Ho usato lo script in una pagina php (add_page) per inserire un record in db con n campi,
all’interno diciamo che ho selezionato film>fantascienza>stargate come valori da passare usando le select.
e qui tutto ok.
Come faccio se vado in edit_page della pagina php e trovermi le select selezionate sui loro corrispettivi valori?
Spero di essermi spiegato bene.
Ciao
Salve, premetto che sono completamente ignorante in materia ma sono riuscito a far funzionare lo script (regione – provincia – comune) su una pagina dove gestisco la raccolta delle firme nei vari comuni. Il problema è che adesso non riesco a visualizzare sulla pagina i risultati della scelta, ovvero, selezionando un comune vorrei visualizzare tutti i dati di quel comune contenuti nel database (Comune, stato attivazione, note, firme raccolte 1, firme raccolte2 , firme raccolte 3) ma non so da dove partire. Qualcuno puo aiutarmi? Grazie
Articolo eccellente, ma è possibile dopo aver cliccato con conferma tirare fuori altri dati relativi all’ultima selezione.
Ciao,no sò se puoi aiutarmi cerco uno script tipo questo che hai pubblicato regioni province comuni.
però con la variante che una volta selezionato il comune mi stampi a video il risultato di una tabella con il nome del comune selezionato.
la tabella è strutturata con i campi: nome ,data ,ora,valore.
Il problema nasce da una raccolta dati a livello nazionale ,una tabella per ogni stazione,quindi è ideale la selezione come strutturata dallo script.
mi potete aiutare?
Ciao Maurizio, non riesco a capire come faccio ad estrarre i dati successivamente. Potresti aiutarmi? Grazie
Ottima pagina… :D
cmq x domani devo fare una tabella con i lati di 4 quadrati (scritti in colonna tipo 3,4,5,6 o 11,12,13,14) e le loro rispettive aree potendo inserire nella pagina di html solo il primo lato…come faccio a calcolarmi tutto??? grazie mille!!! ;-)