Получить $ _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
Можете ли вы привести пример echo (ing) одного флажка check_list []? (И будет ли это похоже на два выбранных?) Спасибо.
Джеймс Эндрю
2
Также следует указать, что если значение не задано в HTML, $checkбудет равно on.
Шон Уолш
9
if($_POST)- бесполезно, $_POSTвсегда будет правдой. Вы должны проверить, если !empty($_POST['check_list'])вместо этого.
Мартиньш Бридис,
3
@ MārtiņšBriedis, который вывел бы индекс массива за пределы, если бы он не существовал. Лучшая проверка была быarray_key_exists('check_list', $_POST) && !empty($_POST['check_list'])
Tyzoid
2
@Tyzoid empty()не вызывает эту ошибку. Из руководства:empty() does not generate a warning if the variable does not exist.
Мартиньш Бридис,
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
Я попробовал оба, но хорошо, я попробую снова (Без [] в форме / имени)
Джеймс Эндрю
16

Вы должны назвать свои флажки соответственно:

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

Вы можете получить доступ ко всем установленным флажкам с помощью

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

пс. убедитесь, что правильно выходите из вашего вывода ( htmlspecialchars())

knittl
источник
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 в этом случае.

РЕДАКТИРОВАТЬ: Как отмечено в комментариях ниже, дальнейшие исследования показывают, что это зависит от DOCTYPE. Если вы установили DOCTYPE для XHTML, потребуется закрыть тег ввода. Если у вас есть DOCTYPE HTML5, потребуется, чтобы входной тег не был закрыт. Существует также вероятность, что это может быть продиктовано тем, в каком браузере пользователь просматривает страницу, и насколько хорошо она соответствует DOCTYPE, указанному в коде.

Джон Гэллап
источник
Неправильно. Самозакрывающийся тег ввода не повлияет на значения, которые передаются в PHP.
Хищник
@Raptor На дальнейшие исследования, да, это может повлиять и, как вы говорите, нет, это не так. но на дальнейшие исследования это влияет только если установлен DOCTYPE. HTML5 не распознает тег как закрытый (и будет недействительным, если он закрыт), в то время как XHTML требует закрытия тега. См. Информационную страницу W3Schools здесь: ссылка
Джон Гэллап
@Raptor Хотя в W3Schools может быть много ошибок, важно отметить, что информация, которую она (и другие веб-сайты) может предоставить, не вызывает сомнений. Я просто констатирую, что в процессе устранения неисправностей ЛЮБАЯ информация, чтобы попытаться решить проблему, лучше, чем НЕТ информации. В этом случае, если вам нужна другая ссылка, W3 указывает, что входной тег не должен быть закрыт каким-либо образом, так как он будет несовместимым. Я отредактирую свой оригинальный ответ, чтобы отразить DOCTYPE.
Джон Гэллап
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
Значение = "проверено" является контрпродуктивным. Если значение не указано, вы получаете «on». Преимущество указания значений, которые вы хотите передать в атрибутах значения, состоит в том, что вы можете отправлять почти произвольные данные, которые не должны становиться индексом массива PHP. Перебор значений массива с помощью foreach также проще, чем перебор ключей.
Рудигер В.
0

В любом случае, это не только доблесть, но и моя любовь.

    // 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 год. Как и MySQL puedo hacer la consulta, venga en matriz o no:

Where id in ($_POST["id"])
Ману Бурреро Санчес
источник