Отримайте $ _POST з декількох прапорців


159

У мене є 1 бланк із декількома прапорцями в ньому (кожен з кодом):

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

Де $row['Report ID']є первинний ключ у базі даних - тому кожне значення відрізняється.

Як я міг би сказати, які прапорці встановлені? (Можливо, кілька)

Це для системи "Вхідні", і внизу є кнопка, за якою я хочу (при натисканні на неї) видалити всі повідомлення (ідентифікатори:), $row['Report ID']які мають прапорець.

Відповіді:


334

Встановіть ім'я у формі на check_list[]та ви зможете отримати доступ до всіх прапорців як масив ( $_POST['check_list'][]).

Ось невеликий зразок за запитом:

<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
Чи можете ви надати мені приклад ехо (англ.) Одного check_list [] прапорець? (І чи буде це схоже на двох вибраних?) Дякую
Джеймс Ендрю

2
Я також повинен зазначити, що якщо в HTML не встановлено значення, воно $checkбуде рівним on.
Шон Уолш

9
if($_POST)- марно, $_POSTзавжди буде правдою. Слід перевірити, чи !empty($_POST['check_list'])замість цього.
Mārtiņš Briedis

3
@ MārtiņšBriedis, що може викликати індекс масиву поза межами, якщо його не існувало. Кращим буде перевіркаarray_key_exists('check_list', $_POST) && !empty($_POST['check_list'])
Тизоїд

2
@Tyzoid empty()не викликає цю помилку. З посібника:empty() does not generate a warning if the variable does not exist.
Mārtiņš Briedis

22

Редагувати Щоб відобразити те, що @Marc сказав у коментарі нижче.

Ви можете зробити цикл через усі розміщені значення.

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
Дивна помилка: Попередження: Неправильний аргумент наданий для foreach () у /home1/mountgam/public_html/zombiewrath/reports.php у рядку 30 = /
Джеймс Ендрю

2
Це буде працювати лише в тому випадку, якщо ви використовуєте []синтаксис у визначенні поля, завдяки чому PHP створює це значення $ _POST як масив. Інакше це буде одне значення без масиву, що призведе до вимикання циклу foreach ().
Марк Б

1
Я спробував і те, і інше, але добре, я спробую ще раз (Без [] у формі / імені)
James Andrew

16

ви повинні назвати свої прапорці відповідно:

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

Ви можете отримати доступ до всіх встановлених прапорців за допомогою

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

пс. переконайтеся, що правильно вийти з результатів ( htmlspecialchars())


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

А після публікації ви можете прокрутити їх:

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

Або отримати певне значення, розміщене на попередній сторінці:

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

12

Вибачте, стара тема, але це важлива для цього згадка, з якою у @JamesRattray та інших виникли проблеми.

НЕ самостійно закривайте inputтег (використовуючи />), коли ви намагаєтесь розмістити кілька значень у скрипті PHP. Коли ви самостійно закриєте тег, він закінчує визначення масиву, і у вас буде лише одне значення, розміщене у вашому сценарії після подання. Насправді відповідь @Scone може не працювати, поки не />буде змінено.

Саме це викликає Warning: Invalid argument supplied for foreach() in /home1/...помилку PHP в цьому випадку.

EDIT: Як зазначалося в коментарях нижче, подальше дослідження свідчить про те, що це залежить від ДОКТИПУ. Якщо у вас встановлено DOCTYPE для XHTML, знадобиться закрити вхідний тег. Якщо у вас є DOCTYPE набір HTML5, він вимагатиме, щоб тег введення не був закритий. Також є ймовірність, що це може бути продиктовано тим, у якому браузері переглядає користувач сторінку та наскільки добре вона відповідає ДОКТИПУ, вказаному в коді.


Неправильно. Самозакривальний тег введення не вплине на значення, що передаються PHP.
Раптор

@Raptor Подальші дослідження Так, це може вплинути на І, як ви кажете, ні, це не так. але на подальші дослідження це впливає лише за умови встановлення ДОКТИПУ. HTML5 не розпізнає тег як закритий (і буде недійсним, якщо він закритий), тоді як XHTML вимагає закрити тег. Дивіться інформацію про сторінку W3Schools на цій сторінці: посилання
Джон Галлап

@Raptor Хоча W3Schools може бути повним помилок, важливо зауважити, що інформація, яку вона (та інші веб-сайти) може надати, є важливою для цього питання. Я просто констатую, що в процесі усунення несправностей БУДЬ-яку інформацію, щоб спробувати виправити проблему, краще, ніж НІ. У цьому випадку, якщо вам потрібна інша посилання, W3 вказує, що тег введення не повинен закриватися жодним чином, оскільки він буде невідповідним. Я відредагую свою оригінальну відповідь, щоб вона відображала ДОКТИП.
Джон Галлап

5

Це досить просто. Зверніть увагу, і ви отримаєте це відразу! :)

Ви створите HTML-масив, який потім буде надісланий до масиву php. Ваш html-код буде виглядати приблизно так:

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

Де [1] [2] [3]є IDs з ваших повідомлень, а це означає , що ви будете echoваш $row['Report ID']на своєму місці.

Потім, коли ви подасте форму, ваш PHP масив буде виглядати приблизно так:

print_r($check_list)

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

Залежно від того, які перевірялися, а які ні.

Я впевнений, що ви можете продовжувати з цього моменту вперед.


6
Пам'ятайте, що check_list[]почалося б з того, check_list[0]а не check_list[1].
Арбітр

1
value = "перевірено" є контрпродуктивним. Якщо значення не вказане, ви отримуєте "увімкнено". Перевага вказування значень, які ви хочете подати в атрибутах значень, полягає в тому, що ви можете надсилати майже довільні дані, які не повинні стати індексом масиву PHP. Ітерація значень масиву за допомогою foreach також простіше, ніж ітерація над ключами.
Рудігер В.

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. Як тільки на MySQL ви знайдете консультацію, будь ласка, немає:

Where id in ($_POST["id"])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.