Uzyskaj $ _POST z wielu pól wyboru

159

Mam 1 formularz z wieloma polami wyboru (każdy z kodem):

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

Gdzie $row['Report ID']jest klucz podstawowy w bazie danych - więc każda wartość jest inna.

Jak mogę stwierdzić, które pola wyboru zostały zaznaczone? (Może wiele)

To jest dla systemu skrzynki odbiorczej i mam poniżej przycisk, który chcę (po kliknięciu) usunąć wszystkie wiadomości (identyfikatory:), $row['Report ID']które mają zaznaczone pole wyboru.

James Andrew
źródło

Odpowiedzi:

334

Ustaw nazwę w formularzu na, check_list[]a będziesz mieć dostęp do wszystkich pól wyboru jako tablicy ( $_POST['check_list'][]).

Oto mała próbka na żądanie:

<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
źródło
4
Czy możesz podać przykład echa jednego check_list [] checkbox? (I czy będzie podobnie dla dwóch wybranych?) Dzięki.
James Andrew,
2
Powinienem również sprecyzować, że jeśli żadna wartość nie zostanie ustawiona w HTML, $checkbędzie równa on.
Sean Walsh
9
if($_POST)- bezużyteczne, $_POSTzawsze będzie prawdziwe. Zamiast tego powinieneś sprawdzić, czy !empty($_POST['check_list']).
Mārtiņš Briedis
3
@ MārtiņšBriedis, co spowodowałoby przekroczenie zakresu indeksu tablicy, gdyby nie istniał. Lepszym czekiem byłbyarray_key_exists('check_list', $_POST) && !empty($_POST['check_list'])
Tyzoid
2
@Tyzoid empty()nie powoduje tego błędu. Z instrukcji:empty() does not generate a warning if the variable does not exist.
Mārtiņš Briedis
22

Edytuj Aby odzwierciedlić to, co @Marc powiedział w komentarzu poniżej.

Możesz wykonać pętlę przez wszystkie przesłane wartości.

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
}
Rożek
źródło
1
Dziwny błąd: Ostrzeżenie: podano nieprawidłowy argument dla funkcji foreach () w /home1/mountgam/public_html/zombiewrath/reports.php w linii 30 = /
James Andrew,
2
To zadziała tylko wtedy, gdy użyjesz []składni w definicji pola, co powoduje, że PHP tworzy tę wartość $ _POST jako tablicę. W przeciwnym razie będzie to pojedyncza wartość niebędąca tablicą, powodując wybuch pętli foreach ().
Marc B
1
Próbowałem obu, ale ok, spróbuję ponownie (bez [] w formularzu / nazwie)
James Andrew,
16

musisz odpowiednio nazwać pola wyboru:

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

możesz wtedy uzyskać dostęp do wszystkich zaznaczonych pól wyboru za pomocą

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

ps. upewnij się, że poprawnie uciekniesz z wyjścia ( htmlspecialchars())

knittl
źródło
12
<input type="checkbox" name="check_list[<? echo $row['Report ID'] ?>]" value="<? echo $row['Report ID'] ?>">

Po poście możesz je przeglądać:

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

Lub uzyskaj określoną wartość opublikowaną z poprzedniej strony:

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

Przepraszamy, stary temat, ale jest to jeden ważny element do omówienia, z którym @JamesRattray i inni mieli problemy.

NIE zamykaj samodzielnie inputtagu (używając />), gdy próbujesz wysłać wiele wartości do skryptu PHP. Kiedy samodzielnie zamkniesz tag, kończy on definicję tablicy, a po przesłaniu do skryptu zostanie wysłana tylko jedna wartość. W efekcie odpowiedź @Scone może nie działać, dopóki nie />zostanie zmieniona.

To właśnie powoduje Warning: Invalid argument supplied for foreach() in /home1/...błąd PHP w tym przypadku.

EDYCJA: Jak zauważono w komentarzach poniżej, dalsze badania sugerują, że jest to zależne od DOCTYPE. Jeśli masz DOCTYPE ustawiony dla XHTML, będzie to wymagało zamknięcia znacznika wejściowego. Jeśli masz zestaw HTML5 DOCTYPE, będzie to wymagać, aby tag wejściowy nie był zamykany. Istnieje również szansa, że ​​może to być podyktowane tym, w jakiej przeglądarce użytkownik przegląda stronę i jak dobrze podąża ona za DOCTYPE określonym w kodzie.

Jon Gallup
źródło
Błędny. Samozamykający się znacznik wejściowy nie ma wpływu na wartości przekazywane do PHP.
Raptor,
@Raptor W dalszych badaniach, tak, to może wpływać i jak mówisz, nie, nie ma. ale po dalszych badaniach ma to wpływ tylko wtedy, gdy ustawiono DOCTYPE. HTML5 nie rozpoznaje tagu jako zamknięty (i byłby nieprawidłowy, gdyby był zamknięty), podczas gdy XHTML wymaga zamknięcia tagu. Zobacz stronę informacyjną W3Schools tutaj: link
Jon Gallup
@Raptor Chociaż szkoła W3Schools może być pełna błędów, ważne jest, aby pamiętać, że informacje, które ona (i inne strony internetowe) może dostarczyć, są przekonujące do pytania. Po prostu stwierdzam, że w procesie rozwiązywania problemów DOWOLNA informacja do rozwiązania problemu jest lepsza niż BRAK informacji. W takim przypadku, jeśli chcesz innego odniesienia, W3 określa, że ​​znacznik wejściowy nie może być w żaden sposób zamknięty, ponieważ będzie niezgodny. Zmienię oryginalną odpowiedź, aby odzwierciedlić DOCTYPE.
Jon Gallup
5

To całkiem proste. Uważaj, a otrzymasz to od razu! :)

Utworzysz tablicę html, która zostanie następnie wysłana do tablicy php. Twój kod html będzie wyglądał następująco:

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

Gdzie [1] [2] [3]IDs wiadomości, co oznacza, że będzie echoPaństwu $row['Report ID']w ich miejsce.

Następnie, kiedy wyślesz formularz, twoja tablica PHP będzie wyglądać następująco:

print_r($check_list)

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

W zależności od tego, które zostały sprawdzone, a które nie.

Jestem pewien, że możesz kontynuować od tego momentu.

Richarda Rodrigueza
źródło
6
Pamiętaj, check_list[]że zacznie się check_list[0]raczej od niż check_list[1].
Arbiter
1
wartość = „zaznaczone” przynosi efekt przeciwny do zamierzonego. Jeśli nie określono żadnej wartości, otrzymasz „on”. Zaletą określenia wartości, które chcesz przesłać w atrybutach wartości, jest to, że możesz wysłać niemal dowolne dane, które nie muszą stać się indeksem tablicy PHP. Iterowanie po wartościach tablic z foreach jest również łatwiejsze niż iterowanie po kluczach.
Rudiger W.
0

En mi caso necesito que venga en un sólo valor, 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
źródło