从多个复选框获取$ _POST


159

我有1个表单,里面有多个复选框(每个都有代码):

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

$row['Report ID']数据库中的主键在哪里- 因此每个值都不同。

我如何知道已选中哪些复选框?(也许多个)

这是针对收件箱系统的,我下面有一个按钮,我想(单击时)删除$row['Report ID']选中了复选框的所有消息(标识:)。

Answers:


334

将表单中的名称设置为check_list[],您将能够以array($_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'])
马丁斯Briedis

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.
马丁斯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
奇怪的错误:警告:/home1/mountgam/public_html/zombiewrath/reports.php中为第30行提供的foreach()参数无效= /
James Andrew

2
这只有在您使用[]字段定义中的语法时才有效,这使PHP将$ _POST值创建为数组。否则它将是一个非数组值,从而导致foreach()循环崩溃。
Marc B

1
我都尝试过,但是好的,我会再尝试一次(表单/名称中没有[])
James Andrew

16

您必须相应地命名您的复选框:

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

然后,您可以使用以下命令访问所有选中的复选框

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

ps。确保正确转义您的输出(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和其他人对此有疑问。

尝试将多个值发布到PHP脚本时,请勿自行关闭input标签(使用/>)。当您自行关闭标签时,它将结束数组定义,并且在提交时将只有一个值发布到脚本中。实际上,@ Scone的答案在/>更改之前可能不会起作用。

这是导致 Warning: Invalid argument supplied for foreach() in /home1/...在这种情况下 PHP错误的。

编辑:如下面的评论中所述,进一步的研究表明,这取决于DOCTYPE。如果您为XHTML设置了DOCTYPE,则将需要关闭输入标签。如果您具有HTML5的DOCTYPE集,则将要求不关闭输入标签。也有可能由用户在哪个浏览器中查看页面以及页面遵循代码中指定的DOCTYPE的程度来决定。


不正确 自闭合输入标记不会影响传递给PHP的值。
猛禽队

@Raptor在进一步研究中,是的,它会影响AND,正如您所说,不是的。但是在进一步研究中,只有设置了DOCTYPE才受影响。HTML5无法识别标记为已关闭(如果已关闭,则无效),而XHTML确实要求标记已关闭。在这里查看W3Schools信息页面:链接
Jon Gallup

@Raptor虽然W3Schools可能充满错误,但重要的是要注意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]ID你的消息S,这意味着你将echo你的$row['Report ID']在自己的位置。

然后,当您提交表单时,您的PHP数组将如下所示:

print_r($check_list)

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

取决于哪些检查,哪些没有。

我确定您可以从现在开始继续。


6
请记住,这check_list[]将始于check_list[0]而不是check_list[1]
仲裁人2014年

1
value =“ checked”是适得其反的。如果未指定任何值,则显示“ on”。在value属性中指定要提交的值的优点在于,您可以发送几乎任意的数据,这些数据不必成为PHP数组索引。使用foreach遍历数组值也比遍历键更容易。
Rudiger W.

0

zh en ven caso necesito que venga en unsólovalor,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);

同意,我将向您提供1个月的昏迷。由于存在MySQL咨询服务,请使用以下方法:

Where id in ($_POST["id"])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.