Holen Sie sich $ _POST aus mehreren Kontrollkästchen

158

Ich habe 1 Formular mit mehreren Kontrollkästchen (jedes mit dem Code):

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

Wo $row['Report ID']ist ein Primärschlüssel in einer Datenbank - also ist jeder Wert anders.

Wie kann ich feststellen, welche Kontrollkästchen aktiviert wurden? (Vielleicht mehrere)

Dies ist für ein Posteingangssystem und ich habe eine Schaltfläche darunter, mit der ich (wenn ich darauf klicke) alle Nachrichten (IDs von :) löschen möchte, bei $row['Report ID']denen das Kontrollkästchen aktiviert ist.

James Andrew
quelle

Antworten:

333

Setzen Sie den Namen im Formular auf check_list[]und Sie können als Array ( $_POST['check_list'][]) auf alle Kontrollkästchen zugreifen .

Hier ist ein kleines Beispiel wie gewünscht:

<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.
    }
}
?>
Sean Walsh
quelle
4
Können Sie mir ein Beispiel für das Echo eines Kontrollkästchens check_list [] geben? (Und wäre es für zwei ausgewählte ähnlich?) Danke.
James Andrew
2
Ich sollte auch angeben, dass, wenn kein Wert im HTML festgelegt ist, $checkgleich ist on.
Sean Walsh
9
if($_POST)- nutzlos, $_POSTwird immer wahr sein. Sie sollten überprüfen, ob !empty($_POST['check_list'])stattdessen.
Mārtiņš Briedis
3
@ MārtiņšBriedis, das einen Array-Index außerhalb der Grenzen verursachen würde, wenn er nicht vorhanden wäre. Eine bessere Überprüfung wärearray_key_exists('check_list', $_POST) && !empty($_POST['check_list'])
Tyzoid
2
@ Tyzoid empty()verursacht diesen Fehler nicht. Aus dem Handbuch:empty() does not generate a warning if the variable does not exist.
Mārtiņš Briedis
22

Bearbeiten Um zu reflektieren, was @Marc im Kommentar unten gesagt hat.

Sie können alle angegebenen Werte durchlaufen.

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
}
Scone
quelle
1
Seltsamer Fehler: Warnung: Ungültiges Argument für foreach () in /home1/mountgam/public_html/zombiewrath/reports.php in Zeile 30 = /
James Andrew
2
Dies würde nur funktionieren, wenn Sie die []Syntax in der Felddefinition verwenden, wodurch PHP diesen $ _POST-Wert als Array erstellt. Andernfalls handelt es sich um einen einzelnen Nicht-Array-Wert, wodurch die foreach () -Schleife explodiert.
Marc B
1
Ich habe beide versucht, aber ok, ich werde es erneut versuchen (ohne [] in Form / Name)
James Andrew
16

Sie müssen Ihre Kontrollkästchen entsprechend benennen:

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

Sie können dann mit auf alle aktivierten Kontrollkästchen zugreifen

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

ps. Stellen Sie sicher, dass Sie Ihrer Ausgabe ordnungsgemäß entkommen ( htmlspecialchars())

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

Und nach dem Beitrag können Sie sie durchlaufen:

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

Oder erhalten Sie einen bestimmten Wert von der vorherigen Seite:

if(isset($_POST['check_list'][$report_id])){
  echo $report_id . " was checked!<br/>";
}
Mārtiņš Briedis
quelle
12

Sorry, altes Thema, aber dies ist ein wichtiger Punkt, den ich erwähnen sollte, mit dem @JamesRattray und andere Probleme hatten.

Schließen Sie das inputTag NICHT selbst (mit />), wenn Sie versuchen, mehrere Werte im PHP-Skript zu veröffentlichen. Wenn Sie das Tag selbst schließen, wird die Array-Definition beendet und bei der Übermittlung wird nur ein einziger Wert in Ihr Skript geschrieben. Tatsächlich funktioniert die Antwort von @Scone möglicherweise erst, wenn die />geändert wird.

Dies verursacht Warning: Invalid argument supplied for foreach() in /home1/...in diesem Fall den PHP-Fehler.

EDIT: Wie in den Kommentaren unten erwähnt, deuten weitere Untersuchungen darauf hin, dass dies von DOCTYPE abhängt. Wenn Sie DOCTYPE für XHTML festgelegt haben, muss das Eingabe-Tag geschlossen sein. Wenn Sie DOCTYPE für HTML5 festgelegt haben, muss das Eingabe-Tag nicht geschlossen werden. Es besteht auch die Möglichkeit, dass dies davon abhängt, in welchem ​​Browser der Benutzer die Seite anzeigt und wie gut sie dem im Code angegebenen DOCTYPE folgt.

Jon Gallup
quelle
Falsch. Das selbstschließende Eingabe-Tag wirkt sich nicht auf die Werte aus, die an PHP übergeben werden.
Raptor
@Raptor Bei weiteren Recherchen kann es sich auf UND auswirken, wie Sie sagen, nein, tut es nicht. Bei weiteren Untersuchungen ist es jedoch nur betroffen, wenn der DOCTYPE eingestellt ist. HTML5 erkennt das Tag nicht als geschlossen (und wäre ungültig, wenn es geschlossen wird), während XHTML das Schließen des Tags erfordert. Siehe die W3Schools Infoseite hier: Link
Jon Gallup
@Raptor Während die W3Schools möglicherweise voller Fehler sind, ist es wichtig zu beachten, dass die von ihr (und anderen Websites) bereitgestellten Informationen für die Frage zutreffend sind. Ich behaupte lediglich, dass bei der Fehlerbehebung von Informationen JEDE Information, um ein Problem zu beheben, besser ist als KEINE Information. Wenn Sie in diesem Fall eine andere Referenz wünschen , gibt der W3 an, dass das Eingabe-Tag in keiner Weise geschlossen werden darf, da es nicht konform ist. Ich werde meine ursprüngliche Antwort bearbeiten, um DOCTYPE wiederzugeben.
Jon Gallup
5

Es ist ziemlich einfach. Achten Sie darauf und Sie werden es sofort bekommen! :) :)

Sie erstellen ein HTML-Array, das dann an das PHP-Array gesendet wird. Ihr HTML-Code sieht folgendermaßen aus:

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

Wo [1] [2] [3]sind die IDs Ihrer Nachrichten, was bedeutet, dass Sie echoIhre $row['Report ID']an ihrer Stelle werden.

Wenn Sie dann das Formular senden, sieht Ihr PHP-Array folgendermaßen aus:

print_r($check_list)

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

Je nachdem welche überprüft wurden und welche nicht.

Ich bin sicher, dass Sie von diesem Punkt an fortfahren können.

Richard Rodriguez
quelle
6
Denken Sie daran, das check_list[]würde check_list[0]eher mit als beginnen check_list[1].
Schiedsrichter
1
value = "geprüft" ist kontraproduktiv. Wenn kein Wert angegeben wird, erhalten Sie 'on'. Der Vorteil der Angabe der Werte, die Sie in den Wertattributen senden möchten, besteht darin, dass Sie nahezu beliebige Daten senden können, die nicht zu einem PHP-Array-Index werden müssen. Das Iterieren über Array-Werte mit foreach ist auch einfacher als das Iterieren über die Schlüssel.
Rüdiger W.
0

En mi caso necesito que venga en un sólo tapfer, por lo tanto no me vale una matriz.

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

Con esto me aseguro que los valores sean 1 y separados por coma. Así en MySQL puedo hacer la Consulta, venga en matriz o no:

Where id in ($_POST["id"])
Manu Burrero Sánchez
quelle