Ottieni $ _POST da più caselle di controllo


159

Ho 1 modulo con più caselle di controllo (ciascuna con il codice):

<input type="checkbox" name="check_list" value="<? echo $row['Report ID'] ?>">

Dove si $row['Report ID']trova una chiave primaria in un database, quindi ogni valore è diverso.

Come potrei sapere quali caselle di controllo sono state selezionate? (Forse multipli)

Questo è per un sistema di posta in arrivo e ho un pulsante in basso che voglio (quando si fa clic) per eliminare tutti i messaggi (ID di:) $row['Report ID']che hanno la casella di controllo selezionata.

Risposte:


334

Impostare il nome nel modulo su check_list[]e si sarà in grado di accedere a tutte le caselle di controllo come un array ( $_POST['check_list'][]).

Ecco un piccolo esempio come richiesto:

<form action="test.php" method="post">
    <input type="checkbox" name="check_list[]" value="value 1">
    <input type="checkbox" name="check_list[]" value="value 2">
    <input type="checkbox" name="check_list[]" value="value 3">
    <input type="checkbox" name="check_list[]" value="value 4">
    <input type="checkbox" name="check_list[]" value="value 5">
    <input type="submit" />
</form>
<?php
if(!empty($_POST['check_list'])) {
    foreach($_POST['check_list'] as $check) {
            echo $check; //echoes the value set in the HTML form for each checked checkbox.
                         //so, if I were to check 1, 3, and 5 it would echo value 1, value 3, value 5.
                         //in your case, it would echo whatever $row['Report ID'] is equivalent to.
    }
}
?>

4
Potete darmi un esempio della casella di controllo echo (ing) one check_list []? (E sarebbe simile per due selezionati?) Grazie.
James Andrew,

2
Dovrei anche specificare che se nessun valore è impostato in HTML, $checksarà uguale on.
Sean Walsh,

9
if($_POST)- inutile, $_POSTsarà sempre vero. Dovresti verificare se !empty($_POST['check_list'])invece.
Mārtiņš Briedis,

3
@ MārtiņšBriedis che causerebbe un indice di array fuori limite se non esistesse. Un controllo migliore sarebbearray_key_exists('check_list', $_POST) && !empty($_POST['check_list'])
Tyzoid

2
@Tyzoid empty()non causa questo errore. Dal manuale:empty() does not generate a warning if the variable does not exist.
Mārtiņš Briedis il

22

Modifica Per riflettere ciò che @Marc ha detto nel commento qui sotto.

Puoi fare un ciclo attraverso tutti i valori pubblicati.

HTML:

<input type="checkbox" name="check_list[]" value="<?=$rowid?>" />
<input type="checkbox" name="check_list[]" value="<?=$rowid?>" />
<input type="checkbox" name="check_list[]" value="<?=$rowid?>" />

PHP:

foreach($_POST['check_list'] as $item){
  // query to delete where item = $item
}

1
Errore strano: avviso: argomento non valido fornito per foreach () in /home1/mountgam/public_html/zombiewrath/reports.php sulla riga 30 = /
James Andrew

2
[]Funzionerebbe solo se usi la sintassi nella definizione del campo, il che fa sì che PHP crei quel valore $ _POST come un array. Altrimenti sarà un singolo valore non-array, causando l'esplosione del ciclo foreach ().
Marc B,

1
Ho provato entrambi, ma ok ci riproverò (senza [] in forma / nome)
James Andrew

16

devi nominare le tue caselle di conseguenza:

<input type="checkbox" name="check_list[]" value="…" />

è quindi possibile accedere a tutte le caselle di controllo selezionate con

// loop over checked checkboxes
foreach($_POST['check_list'] as $checkbox) {
   // do something
}

ps. assicurati di sfuggire correttamente all'output ( htmlspecialchars())


12
<input type="checkbox" name="check_list[<? echo $row['Report ID'] ?>]" value="<? echo $row['Report ID'] ?>">

E dopo il post, puoi scorrere attraverso di loro:

   if(!empty($_POST['check_list'])){
     foreach($_POST['check_list'] as $report_id){
        echo "$report_id was checked! ";
     }
   }

Oppure ottieni un determinato valore pubblicato dalla pagina precedente:

if(isset($_POST['check_list'][$report_id])){
  echo $report_id . " was checked!<br/>";
}

12

Siamo spiacenti, vecchio argomento, ma questo è un pezzo importante da menzionare per questo, con cui @JamesRattray e altri avevano problemi.

NON chiudere automaticamente il inputtag (usando />) quando si tenta di pubblicare più valori nello script PHP. Quando si chiude automaticamente il tag, termina la definizione dell'array e al momento dell'invio verrà inviato un solo valore allo script. In effetti la risposta di @Scone potrebbe non funzionare fino a quando non />viene modificata.

Questo è ciò che causa l' Warning: Invalid argument supplied for foreach() in /home1/...errore PHP in questo caso.

EDIT: Come notato nei commenti qui sotto, ulteriori ricerche suggeriscono che questo dipende da DOCTYPE. Se DOCTYPE è impostato per XHTML, sarà necessario chiudere il tag di input. Se si dispone di DOCTYPE impostato su HTML5, è necessario che il tag di input non venga chiuso. È anche possibile che ciò sia dettato dal browser in cui l'utente sta visualizzando la pagina e da quanto segue il DOCTYPE specificato nel codice.


Non corretto. Il tag di input a chiusura automatica non influirà sui valori che passano a PHP.
Raptor,

@Raptor Su ulteriori ricerche, Sì, può influenzare E come dici tu, no, non lo fa. ma su ulteriori ricerche, è interessato solo se è impostato DOCTYPE. HTML5 non riconosce il tag come chiuso (e non sarebbe valido se fosse chiuso), mentre XHTML richiede che il tag sia chiuso. Vedi la pagina di informazioni su W3Schools qui: link
Jon Gallup

@Raptor Sebbene le scuole W3 possano essere piene di errori, è importante notare che le informazioni che essa (e altri siti Web) possono fornire sono convincenti alla domanda. Sto semplicemente affermando che nel processo di risoluzione dei problemi QUALSIASI informazione per cercare di risolvere un problema è meglio di NESSUNA informazione. In questo caso, se si desidera un altro riferimento, W3 specifica che il tag di input non deve essere chiuso in alcun modo poiché non sarà conforme. Modificherò la mia risposta originale per riflettere DOCTYPE.
Jon Gallup,

5

È abbastanza semplice Presta attenzione e lo otterrai subito! :)

Creerai un array html, che verrà quindi inviato all'array php. Il tuo codice html sarà simile al seguente:

<input type="checkbox" name="check_list[1]" alt="Checkbox" value="checked">
<input type="checkbox" name="check_list[2]" alt="Checkbox" value="checked">
<input type="checkbox" name="check_list[3]" alt="Checkbox" value="checked">

Dove [1] [2] [3]sono la IDs dei messaggi, il che significa che si vuole echoil vostro $row['Report ID']al loro posto.

Quindi, quando invii il modulo, il tuo array PHP sarà simile al seguente:

print_r($check_list)

[1] => checked [3] => checked

A seconda di quali sono stati controllati e quali no.

Sono sicuro che puoi continuare da questo punto in avanti.


6
Ricorda che check_list[]sarebbe iniziare con check_list[0]piuttosto che check_list[1].
Arbitro

1
value = "checked" è controproducente. Se non viene specificato alcun valore, si ottiene "on". Il vantaggio di specificare i valori che si desidera inviare negli attributi valore è che è possibile inviare dati quasi arbitrari che non devono diventare un indice di array PHP. È anche più semplice scorrere i valori dell'array con foreach piuttosto che scorrere le chiavi.
Rudiger W.

0

In questo caso, questo verrà in un unico valore, per lo stesso vale la pena.

    // Primero paso las matrices del post a valores separados por coma.
    foreach($_POST as $n => $v) if (is_array($v)) $_POST[$n] = implode(",", $v);

Consto me aseguro que los valores sean 1 y separados por coma. Come in MySQL, è possibile consultare la pagina, in inglese o no:

Where id in ($_POST["id"])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.