Blog

[PHP] Selezioni multiple con la checkbox

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">


Post image



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? :)

Articoli correlati

DIASPORA* Facebook

Pubblicato il 26 settembre 2007 da e letto 15931 volte.

Link di trackback

Abbonati al feed RSS. Se non sai cos'è guarda qui.

Abbonati alla newsletter per ricevere via email ogni nuovo articolo pubblicato. L'indirizzo verrà gestito da FeedBurner.

Dai il tuo parere: Commenta questo articolo!
29 commenti su [PHP] Selezioni multiple con la checkbox
  1. Carlo dice:

    Grazie.. ottimo tutorial..

    venerdì, 4 luglio 2008 alle 20:45
  2. DnaX dice:

    Prego! ;)

    venerdì, 4 luglio 2008 alle 21:03
  3. -?raSMuS- dice:

    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!!!

    martedì, 22 luglio 2008 alle 18:45
  4. DnaX dice:

    Il mio era un codice d'esempio, ovviamente il primo elemento è "disponibile" fuori dal while. Con il costrutto foreach si semplifica il tutto.

    sabato, 26 luglio 2008 alle 0:22
  5. C0sEnO dice:

    E per inserire i valori selezionati da checkbox in una tabella del database come si fa?

    martedì, 2 settembre 2008 alle 18:54
  6. DnaX dice:

    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.

    martedì, 2 settembre 2008 alle 21:04
  7. C0sEnO dice:

    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 ;))

    mercoledì, 3 settembre 2008 alle 21:31
  8. C0sEnO dice:

    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);
    }



    :D

    mercoledì, 3 settembre 2008 alle 21:41
  9. DnaX dice:

    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!

    giovedì, 4 settembre 2008 alle 0:46
  10. C0sEnO dice:

    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!!! ;)

    martedì, 9 settembre 2008 alle 11:54
  11. DnaX dice:

    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&lt;$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 [].

    giovedì, 11 settembre 2008 alle 0:25
  12. C0sEnO dice:

    Grazie infinite per la risposta! Provo subito a fare queste modifiche e ti farò sapere!

    ;)

    giovedì, 11 settembre 2008 alle 10:09
  13. C0sEnO dice:

    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?

    venerdì, 12 settembre 2008 alle 11:32
  14. DnaX dice:

    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?".

    venerdì, 12 settembre 2008 alle 16:14
  15. Mariantonietta dice:

    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
    ?>

    mercoledì, 1 ottobre 2008 alle 16:51
  16. DnaX dice:

    @Mariantonietta: Ti ho risposto in privato. Adesso pubblico un piccolo articolo sulla buona programmazione. In pratica sono i consigli che ti ho dato. ;)

    lunedì, 6 ottobre 2008 alle 14:48
  17. Fabrizio dice:

    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.

    martedì, 14 ottobre 2008 alle 12:32
  18. DnaX dice:

    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!

    martedì, 14 ottobre 2008 alle 13:50
  19. Roberto dice:

    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

    venerdì, 7 novembre 2008 alle 9:55
  20. Carlo dice:

    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

    venerdì, 7 novembre 2008 alle 10:01
  21. marco dice:

    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ò:

    sabato, 21 maggio 2011 alle 11:27
  22. DnaX dice:

    Se tutte le checkbox hanno lo stesso nome dovresti ricevere un array... prova ad usare la funzione print_r sulla variabile POST che ricevi.

    sabato, 4 giugno 2011 alle 20:03
  23. Maurizio dice:

    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

    martedì, 2 agosto 2011 alle 11:05
  24. Roberto dice:

    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

    martedì, 2 agosto 2011 alle 11:54
  25. DnaX dice:

    @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 :)

    giovedì, 3 novembre 2011 alle 1:41
  26. daniele dice:

    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>&nbsp;</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

    martedì, 6 dicembre 2011 alle 18:45
  27. paolo dice:

    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

    lunedì, 30 gennaio 2012 alle 16:38
  28. Enanias Saldana dice:

    scusa, non riesco a vedere tutti i dati dell’array, dovrei dichiarare la dimensione dei campi di ogni valore dell’array?

    giovedì, 2 novembre 2017 alle 17:32
  29. Luca dice:

    Ciao ho un problema con le check.
    Riesco a prendere i valori da esse ma non so come fare i controlli(esempio: se viene selezionato un servizio, il prezzo sale di tot..) sulle singole perchè nell’array i value delle check sono tutte concatenate senza spazi.
    Come posso fare?

    domenica, 19 novembre 2017 alle 16:34
Lascia un commento

CC BY-NC-SA 3.0 2004-2012 Daniele Napolitano — Per informazioni sulla licenza leggere le Note legali
Torna su