Vediamo oggi come effettuare selezioni multiple, per esempio in una tabella, usando il controllo checkbox. Mi sono sempre chiesto come poter gestire centinaia di checkbox in maniera da semplificare il controllo della selezione lato server con php.
ATTENZIONE: Sono richiesti prerequisiti riguardo la programmazione php.
Esempio di un controllo checkbox in html:
<input type="checkbox" name="pippo" value="1">
Il trucco risiede nel assegnare come nome ai controlli in array nella sequente forma: nome_var[]. Come valore del checkbox invece è necessario assegnare un numero o parola univoca, ovvero non devono essere ripetuti più di una volta nella tabella.
Esempio:
<input type="checkbox" name="nome_var[]" value="id1">
<input type="checkbox" name="nome_var[]" value="id2">
<input type="checkbox" name="nome_var[]" value="id3">
.....
Questa regola viene automatica se stiamo visualizzando il contenuto di una tabella da un database. Infatti la chiave primaria sarà sempre univoca.
Esempio con chiave primaria 'id'
$sql = "SELECT * FROM tabella";
$result = mysql_query($sql, $connect_id);
while ( $record = mysql_fetch_array($result) )
{
echo '<tr><td><input type="checkbox" name="nome_var[]" value="'.$record[id].'"></td><td>'.$record['nome'].'</td><td>'.$record['cognome'].'</td></tr>';
}
Al momento dell'invio del form viene aggiunto il valore all'array solo se selezionato.
Se questa è la nostra tabella con i checkbox ([ ]):
[#] Filippo
[ ] Alice
[ ] Marco
[#] Sara
Verrà fatta questa operazione:
nome_var[] = "Filippo";
nome_var[] = "Sara";
Quindi solo gli elementi selezionati saranno inclusi nell'array.
Adesso avremo questa struttura chiave/valore nell'array:
nome_var[0] = "Filippo"
nome_var[1] = "Sara"
Ora che abbiamo capito come funziona il form e l'assegnamento degli elemanti vediamo come elaborarli sul server con php.
Innanzitutto recuperiamo la variabile inviata con:
$nome_var = $_POST['nome_var'];
Adesso controlliamo che sia veramente un array e se contiene elementi:
if( is_array($nome_var) ) {
La funzione is_array ritornerà 'vero' solo se $nome_var risulta un array.
Adesso visualizziamo gli elementi selezionati:
echo "Elementi selezionati: ".count($nome_var)."<br/>";
echo "-> ".reset($nome_var);
while( $elemento = next($nome_var) ) echo "-> $elemento <br/>";
La funzione count restituirà il numero degli elementi dell'array.
reset imposterà il puntaore interno dell'array al primo elemento, ed ritornerà il valore indicato (quindi il primo).
next, invece farà avanzare il puntatore ed assegnerà il valore indicato dal puntatore. Quando arrivarà alla fine dell'array restituirà un valore falso, facendo terminare il ciclo while.
In pratica reset preleva il primo elemento e il ciclo while con current si occupa di estrarre gli altri elementi dall'array. Quindi saranno visualizzati gli elementi selezionati
Vediamo la funzione completa:
$nome_var = $_POST['nome_var'];
if( is_array($nome_var) )
{
echo "Elementi selezionati: ".count($nome_var)."<br/>";
echo "-> ".reset($nome_var);
while( $elemento = next($nome_var) ) echo "-> $elemento <br/>";
}
Output:
Elementi selezionati: 2
->Filippo
->Sara
Se c'è qualcosa che non vi è chiaro commentate!
PS. Ho messo Geshi... si vede? ![]()



→ blog
→ risorse
→ contenuti
→ portfolio
→ i tuoi dati
→ banner







Grazie.. ottimo tutorial..
Prego! ;)
Perfetto il tuo codice....ci hai risolto un grande problema grazie
$var = reset($utente);
delete_utente($var);
deldir ("public/$var");
while( $elemento = next($utente)){
delete_utente($elemento);
deldir ("public/$elemento");
}
in questo modo però cancelli anche il primo della lista....col tuo codice non riuscivamo a cancellare il primo elemento della lista....una cosa in +....potrebbe servire a qualcuno!!
have a nice day!!!
Il mio era un codice d'esempio, ovviamente il primo elemento è "disponibile" fuori dal while. Con il costrutto foreach si semplifica il tutto.
E per inserire i valori selezionati da checkbox in una tabella del database come si fa?
Un possibile esempio molto semplificato potrebbe essere questo:
$nome_var = $_POST['nome_var'];
if( is_array($nome_var) )
{
echo 'Elementi selezionati: ' . count( $nome_var ) . '<br/>';
foreach ( $nome_var as $value ) {
$sql = "INSERT INTO tabella VALUES ('$value')";
$result = mysql_query($sql);
}
}
Inserisce le stringhe selezionate dalle checkbox in una tabella con un solo campo.
Grazie mille per la risposta!
A me occorre in particolare questa funzionalità :
Se ho N checkbox, ognuna con valore diverso, vorrei che non avvenissero N inserimenti in tabella, ma un unico inserimento dove nel campo interessato compaiono concatenati tutti i valori selezionati.
Per esempio:
Se scelgo la checkbox A con valore "valoreA" e la checkbox B con valore "valoreB", il risultato dovrebbe essere un inserimento con contenuto "valoreA+valoreB"
Grazie in anticipo per la risposta ;))
Credo di esserci riuscito cosi':
$nome_var = $_POST['nome_var'];$roba = "";
if( is_array($nome_var) )
{
echo 'Elementi selezionati: ' . count( $nome_var ) . '<br/>';
foreach ( $nome_var as $value )
$roba .= $value."+";
//elimino l'ultimo +
$res = substr($roba, 0, -1);
$sql = "INSERT INTO tabella(valori) VALUES ('$res')";
$result = mysql_query($sql);
}
Perfetto così! Ti ho modificato il commento in modo da evidenziare il codice. ;)
Se ti servono consigli o altro riguardo il php seguimi via feed!
Ho un nuovo problema. Ecco quello che ho:
$funzioni = "fA+fB+fC+fD";$singolefunzioni = explode("+",$funzioni);
$numerofunzioni = count($singolefunzioni);
Ogni funzione è legata a N strutture tra loro distinte. Per esempio:
fA ha S1 e S2; fB ha S3; fC ha S4, S5 e S6; fD ha S7
A me servirebbe una form in cui per ogni funzione mi compaiano tutte le strutture collegate come checkbox e io possa selezionare quelle che voglio realmente utilizzare.
Per ogni funzione, poi, dovrei essere in grado di recuperare tramite metodo POST le strutture selezionate.
Per la prima parte ho fatto cosi':
for ($f=0;$f<$numerofunzioni;$f++){
$struttura[$f] = $singolefunzioni[$f];
echo "<b>".$singolefunzioni[$f],"</b>:\n<br>\n";
$risultato = mysql_query(...) //recupero le singole strutture
while ($valore = mysql_fetch_array($risultato))
{
echo "<input type=\"checkbox\" name=\"$struttura[$f]\" value=\"$valore[0]\" /> $valore[0] \n<br>\n";
}
echo "<br>\n";
}
Però questo non passa nulla alla form...
Sapete darmi qualche dritta?
GRAZIE!!! ;)
Il codice mi sembra corretto. Controlla che la tua query SQL produca risultato. Puoi controllare il ritorno di mysql_query, se è FALSE ha commesso qualche errore.
Altro consiglio, quando devi iterare sugli array, usa il costrutto foreach, è più pulito e risparmi l'iteratore.
In pratica
for ($f=0;$f<$numerofunzioni;$f++)Diventa
foreach( $singolefunzioni as $funzione )Mentre ogni occorrenza di $struttura[$f] o di $singolefunzioni[$f] (perché avere un duplicato?) diventa $funzione. Non ti serve neppure count($singolefunzioni).
PS. Per visualizzare il codice come faccio io basta che tu metta il codice tra {code}{/code}, sostituisci le parentesi graffe con parentesi quadre [].
Grazie infinite per la risposta! Provo subito a fare queste modifiche e ti farò sapere!
;)Ho cambiato il codice in questo modo:
foreach( $singolefunzioni as $funzione )
{
echo "<b>".$funzione,"</b>:\n<br>\n";
$risultato = mysql_query("select distinct voce from opzioni where categoria='$funzione'");
while ($valore = mysql_fetch_array($risultato))
{
echo "<input type=\"checkbox\" name=\"$funzione\" value=\"$valore[0]\" /> $valore[0] \n<br>\n";
}
echo "<br>\n";
}
e genera il seguente codice (che incollo in piccola parte):
<b>Amministrazione e personale</b>:
<br>
<input type="checkbox" name="Amministrazione e personale" value="Amministrazione" /> Amministrazione
<br>
<input type="checkbox" name="Amministrazione e personale" value="Magazzino" /> Magazzino
<br>
<input type="checkbox" name="Amministrazione e personale" value="Segreteria clienti" /> Segreteria clienti
<br>
<input type="checkbox" name="Amministrazione e personale" value="Personale" /> Personale
Cosa deve andare al posto di $funzione all'interno dell'input checkbox affinché siano passate tutte le strutture selezionate per ciascuna funzione?
Beh, $valore[0] dovrebbe corrispondere ad ogni campo "voce" selezionato dalla query. Mi viene una domanda, cosa c'è nel campo "voce"? Aiutati con la funzione print_r per visualizzare i dati.
Ah, se usi msn, skype o irc possiamo risolvere il problema più velocemente. Trovi tutto nella pagine "Chi sono?".
Ho bisogno di aiuto vorrei inserire delle check in questo codice:
<?php
$database = 'vinidb';
$link=mysql_connect('localhost','root','') or die ("Impossibile Connettersi al Server");
mysql_select_db($database, $link) or die ("Impossibile connettersi al database $database");
$sql = 'SELECT * FROM `categoria` ORDER BY `Nomec` ASC';
$a=mysql_query($sql);
$ar=mysql_affected_rows($link);
if ($ar==0) {print("Attenzione - Sito in costruzione - Attualmente non sono disponibili categorie. Riprovare piu' tardi"); }
else {
print('<table width="800" border="3" cellpadding="0" cellspacing="0">');
$contar = 1;
$tr = 0;
while($rp=mysql_fetch_array($a)) {
if($tr == 0) {print ("<tr bgcolor=\"#00CC99\">"); $tr = 1;}
QUANDO INSERISCO UN NUOVO VINO DEVE ESSERE PRESENTE UNA CHECK IN MODO DA SELEZIONARLO. HO PROVATO COL CODICE SOPRA DESCRITTO MA NON CI RIESCO....AIUTO!!!
print("<td width=\"400\"><div class=\"sinistra\"><a href=\"searchidc.php?id=".$rp['id_categoria']."&pag=1&ordina=0\">".$rp['Nomec']."</a><br />");
$idc= $rp['id_categoria'];
$sql2 = 'SELECT * FROM `vini` WHERE id_categoria = "'.$idc.'" ORDER BY `nome_sc` ASC';
$b=mysql_query($sql2);
$ar2=mysql_affected_rows($link);
if ($ar2==0) { print("Questa categoria attualmente non dispone di sottocategorie</div>"); }
else {
while($rp2=mysql_fetch_array($b)) {
print(" -<a href=\"searchsidc.php?sid=".$rp2['id_categoria']."&pag=1&ordina=0\">".$rp2['nome_vino']."</a>-");
}//graffa While esistono sottocategorie
}// graffa di else esistono sottocategorie
print("</div></td>");
$test = ($contar % 2);
if ($test == 0) {print ("</tr>"); $tr = 0; }
$contar=$contar+1;
}// graffa while ci sono dei record dalla query di categorie
$testf = ($contar % 2);
if ($testf != 0) {print("</tr>");}
print("</table>");
}// graffa di else ci sono categorie
?>
@Mariantonietta: Ti ho risposto in privato. Adesso pubblico un piccolo articolo sulla buona programmazione. In pratica sono i consigli che ti ho dato. ;)
Ciao, avrei bisogno di un chiarimento se ti è possibile.
Io genero le mie checkbox in maniera dinamica prendendo valori dal db.
in pratica, essendo il sito della mia squadra di calcio a 8, per ogni partita faccio visualizzare con relative checkbox:
i portieri
i difensori
i centrocampisti
gli attaccanti
tramite le checkbox appunto, seleziono chi voglio convocare x quella partita.
ma come faccio poi, nel momento in cui viene premuto il submit, a dirgli che per ogni checkbox spuntata deve mandare una mail a quel giocatore?
cioè, ovviamente l’isset "convoca" è la prima condizione di verifica,
ma poi? come faccio a dirgli a php "guarda che ho selezionato tizio, caio e sempronio con id_giocatore x" che lo prende appunto dal value della checkbox di prima?
è questo che non capisco, il resto lo so fare.. grazie in anticipo x lì’eventuale risposta.
Ad ogni input dai come valore l'id del giocatore, mentre come nome sempre lo stesso seguito da []. Quando invii il form con un submit prendi la variabile con cui hai chiamato tutti i checkbox e la scorri l'array con un ciclo foreach. Ad ogni iterazione selezioni dal database l'email del giocatore relativo all'id e invii la mail!
Buon giorno e complimenti per i preziosi suggerimenti; c'è una cosa che proprio non capisco come funzioni:
l’istruzione
while( $elemento = next($nome_var) ) echo "-> $elemento <br/>";
su quali basi funziona? Come può "capire" se $elemento è = al succesivo? Si intende se l’indice è uguale o il valore?
Grazie e saluti.
Roberto
Se non erro significa che:
finchè (esiste un valore successivo, $elemento prende quel valore)
e ne fa l’echo
quindi stampa tutti i valori presenti nell’array
CIAO
Salve DNAX puoi aiutarmi...
Ho un form, da inviare via email, nel quale ci sono una serie di checkbox dove scegliere dei prodotti.. Il problema è che, quando invio il form via mail, mi prende solo il valore dell’ultima checkbox selezionata, e non di tutte. Che devo fare??? :dhò:
Se tutte le checkbox hanno lo stesso nome dovresti ricevere un array... prova ad usare la funzione print_r sulla variabile POST che ricevi.
Grazie 1000 ... ci ho sbattuto la testa almeno 2 giorni per tirare fuori i valori dalla checkbox!
Potenza della rete ...
Meriti una bella stelletta ... FAV!
Maurizio
Ciao Dnax, potresti spiegarmi la logica alla base dell’istruzione:
while( $elemento = next($nome_var) ) echo "-> $elemento <br/>";
Carlo ha provato a spiegarmi ma ancora non sono convinto.
Quando sono vere le condizioni?
E‘ giusto formulare una condizione così o è solo un escamotage che di per se non sarebbe una funzione corretta a livello di sintassi ma che funziona.
grazie e buona giornata,
Roberto
@Roberto: E' una funzione corretta, sia a livello sintattico che semantico. Ad ogni ciclo viene eseguita l'istruzione next(), quindi viene assegnata a $elemento e successivamente il while valuta che $elemento è un valore diverso da false. Quindi se è vero esegue l'istruzione seguente. Ovviamente c'è una sola istruzione quindi le parentesi graffe non servono.

Spero di essere stato esaustivo, altrimenti chiedi più nel dettaglio cosa non ti torna
ciao, provo a far funzionare il codice ma non ci riesco. Io non ci capisco molto di php, ma ho bisogno di questo script per il mio sito.
Ho provato a creare delle checkbox che richiamano questo script, collegato ad un db, ma nn va. Metto lo script
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="AlterVista - Editor HTML">
<TITLE></TITLE>
</HEAD>
<BODY>
<input type="checkbox" name="nome_var[]" value="tipo_file">tipo<br>
<input type="checkbox" name="nome_var[]" value="nome_file">prezzo<br>
<form action=invio.php target="_blank">
<input type="submit"value="prova">
<P> </P>
</BODY>
</HTML>
invio.php
<?
$connect_id = mysql_connect('', '', '') or die('Connessione fallita: ' . mysql_error());
// Selezione database di test
mysql_select_db('') or die('Selezione DB fallita: ' . mysql_error());
$sql = "SELECT * FROM tabella_files";
$result = mysql_query($sql, $connect_id);
while ( $record = mysql_fetch_array($result) )
{
echo '<tr><td><input type="checkbox" name="nome_var[]" value="'.$record[id].'"></td><td>'.$record['nome_file'].'</td><td>'.$record['tipo_file'].'</td></tr>';
}
$result = mysql_query($sql);
$nome_var = $_POST['nome_var'];
if( is_array($nome_var) )
{
echo "Elementi selezionati: ".count($nome_var)."<br/>";
echo "-> ".reset($nome_var);
while( $elemento = next($nome_var) ) echo "-> $elemento <br/>";
}
?>
si connette al db ma niente, mi fa vedere altre checkbox e mi mostra tutti i dati del db. Qualcuno può aiutarmi? grazie
salve a tutti il mio problem è un’altro e da giorni che provo a risolverlo senza successo io vorrei selezionare tramite checkbox dei risultati di una tabella e modificarli assegnando a tutti lo stesso valore in una sola operazione grazie per il prezioso aiuto