Una delle questioni in cui mi capita di imbattermi di frequente sui forum tecnici ai quali partecipo รจ legata alla gestione dei checkbox con PHP. In realtร si tratta di una tematica di base, ma a giudicare dalla frequenza in cui mi capita di imbattersi in discussioni sull’argomento, non posso non pensare che sia necessario fare un po’ di chiarezza.
Quello che mi propongo di fare, quindi, รจ di mettere la parola fine sulla questione offrendo una trattazione il piรน possibile chiara ed esaustiva circa l’utilizzo dei controlli di tipo checkbox per effettuare scelte singole e multiple all’interno di un form gestito con PHP.
Indice
I checkbox in HTML
Come tutti sappiamo, i checkbox sono un tipo di controllo previsto dall’HTML per la gestione dei moduli (form). Questo controllo รจ utilizzato, normalmente, per effettuare delle scelte di tipo SI/NO.
Un esempio tipico di utilizzo dei checkbox รจ per l’accettazione (o meno) di un regolamento o per l’attivazione (o meno) di un servizio opzionale. Tuttavia, il checkbox puรฒ essere utilizzato anche per effettuare delle scelte multiple all’interno di un elenco di voci, come accade quando ci viene chiesto di selezionare un elenco di servizi opzionali di nostro interesse all’interno di quelli disponibili.
Se l’utilizzo dei checkbox per un singolo valore puรฒ sembrare banale, sicuramente un po’ piรน complesso รจ l’utilizzo di questo controllo per la selezione di scelte multiple. Tuttavia, andiamo con ordine e vediamo, per prima cosa, come recuperare il valore di un checkbox.
Recuperare il valore di un checkbox con PHP
Vediamo un esempio di un semplicissimo modulo in cui l’utente deve checkare in caso di accettazione del contratto:
<form method="post" action="modulo.php">
<input type="checkbox" name="contratto" value="si"/> Accetto il contratto<br/><br/>
<input type="submit" value="Invia il modulo"/>
</form>
Il nostro modulo invia i dati con metodo POST al file “modulo.php”, all’interno del quale dovremo recuperare il valore del nostro checkbox. Normalmente, per recuperare il valore di un campo input, facciamo qualcosa del genere:
$contratto = $_POST['contratto'];
Nel caso dei checkbox, tuttavia, una simile sintassi potrebbe non essere corretta. Infatti, nel momento in cui il nostro checkbox non รจ stato spuntato, la nostra applicazione restituirร un E_NOTICE in quanto l’indice “contratto” non sarร presente all’interno dell’array $_POST.
Una soluzione corretta, pertanto, sarebbe:
$contratto = isset($_POST['contratto']) ? $_POST['contratto'] : 'no';
In questo modo non avremo nessun E_NOTICE nel nostro log e la nostra variabile $contratto avrร sempre un valore: “si” nel caso in cui il checkbox sia stato spuntato, “no” in caso contrario.
Recuperare scelte multiple attraverso i checkbox e PHP
Supponiamo ora di voler creare un modulo in cui l’utente puรฒ selezionare, all’interno di un set di opzioni prestabili, i propri interessi. Una simile necessitร puรฒ essere gestita, appunto, attraverso i checkbox.
L’errore piรน comune รจ di predisporre il modulo in questa maniera:
<form method="post" action="modulo.php">
<h3>Quali sono i tuoi interessi?</h3>
<input type="checkbox" name="interessi" value="cinema"/> Cinema<br/><br/>
<input type="checkbox" name="interessi" value="musica"/> Musica<br/><br/>
<input type="checkbox" name="interessi" value="sport"/> Sport<br/><br/>
<input type="submit" value="Invia il modulo"/>
</form>
In questo modo, il modulo non riesce a trasmettere una molteplicitร di valori ma uno solo; questo significa che se l’utente seleziona piรน valori, l’applicazione (PHP) di destinazione raccoglierร unicamente il valore dell’ultimo checkbox. Per fare un esempio, se l’utente seleziona le voci “Cinema” e “Musica”, l’applicativo PHP (supponendo che abbia lo stesso semplice codice visto per l’esempio precedente) assegnerร alla variabile $interessi il valore “musica” (cioรจ il valore dell’ultimo checkbox spuntato).
Ma come utilizzare i checkbox per consentire la selezione di scelte multiple? La cosa piรน importante da fare consiste nel modificare il markup del modulo trasformando il valore dell’attributo name da:
name="interessi"
in
name="interessi[]"
Il codice completo del nostro modulo, quindi, sarร :
<form method="post" action="modulo.php">
<h3>Quali sono i tuoi interessi?</h3>
<input type="checkbox" name="interessi[]" value="cinema"/> Cinema<br/><br/>
<input type="checkbox" name="interessi[]" value="musica"/> Musica<br/><br/>
<input type="checkbox" name="interessi[]" value="sport"/> Sport<br/><br/>
<input type="submit" value="Invia il modulo"/>
</form>
A questo punto, perรฒ, dobbiamo fare una modifica anche nel file PHP di destinazione. Ciรฒ che “arriverร ” al nostro file PHP, infatti, non sarร piรน un semplice valore, ma un vettore contenente una molteplicitร di valori. Vediamo un esempio di codice PHP per gestire la selezione di scelte multiple tramite checkbox:
$interessi = isset($_POST['interessi']) ? $_POST['interessi'] : array();
foreach($interessi as $interesse) {
echo $interesse . '<br/>';
}
Come potete vedere, la variabile $interessi รจ un array e come tale viene gestita (nell’esempio, molto banalmente, ci limitiamo a ciclarne il contenuto per stamparne a video i vari valori).
Vediamo ora un esempio completo con qualche controllo a corredo. Supponiamo che il nostro utente debba selezionare almeno un interesse e non possa selezionarne piรน di due:
$interessi = isset($_POST['interessi']) ? $_POST['interessi'] : array();
if (!count($interessi)) {
echo 'Errore! Devi selezionare almeno un interesse!';
} elseif (count($interessi) > 2) {
echo 'Errore! Non puoi selezionare piรน di due interessi!';
} else {
echo 'Complimenti! Questi gli interessi che hai selezionato:<ul>';
foreach($interessi as $interesse) {
echo '<li>' . $interesse . '</li>';
}
echo '</ul>';
}
Si noti, per finire, che il medesimo risultato funzionale avrebbe potuto raggiungersi mediante l’utilizzo di una select box, modificando il codice HTML del nostro esempio in questo modo:
<form method="post" action="prova.php">
<h3>Quali sono i tuoi interessi?</h3>
<select name="interessi[]" multiple="true">
<option value="cinema">Cinema</option>
<option value="musica">Musica</option>
<option value="sport">Sport</option>
</select>
<input type="submit" value="Invia il modulo"/>
</form>
Anche in questo caso si noti come sia stato settato l’attributo name del tag <select> e l’utilizzo dell’attributo multiple che consente di abilitare la select box alla selezione di scelte multiple.
In conclusione, gestire le checkbox in PHP รจ una pratica fondamentale da conoscere per chiunque lavori con i moduli web. Seguendo i principi sopra esposti, sarete in grado di gestire correttamente sia le selezioni singole che le scelte multiple, garantendo un’esperienza utente piรน fluida e priva di errori.