验证在数组中发送的复选框

时间:2012-10-18 14:51:03

标签: php

我有一个包含多个复选框的表单,我想将其放入数组中。我按照此处提供的示例进行操作:http://www.kavoir.com/2009/01/php-checkbox-array-in-form-handling-multiple-checkbox-values-in-an-array.html

所以我准备好了文件:

checkboxes.php:

<form action="checkboxes2.php" method="post">
<input type="checkbox" name="tags[]" value="1" />1<br>
<input type="checkbox" name="tags[]" value="2" />2<br>
<input type="checkbox" name="tags[]" value="3" />3<br>
<input type="checkbox" name="tags[]" value="4" />4<br>
<input type="submit" value="Send" />
</form>

checkboxes2.php:

<?php
print_r($_POST["tags"]);
?>

非常简单......我意识到我应该只获取这些文本框的值,而不是它们是否被选中。但我仍然得到这个错误:

Undefined index: tags in checkboxes2.php on line 2

我完全不知道我在这里做错了什么。我通过上面的链接中的示例并完成了一切完全相同(主要是复制/粘贴和更改某些部分,如添加提交按钮)但我没有得到输出,如示例中所示。我应该至少得到每个复选框的值,对吗?

我想做什么:我想查看复选框数组,看看哪些已被选中,并在第二个数组中添加“是”或“否”,如下所示:

<?php
  $number1 = $_POST["tags"];
  $number2 = array();

  foreach($number1 as $number1_output)
  {
    if(isset($number1_output))
    {
      $number2[] = "yes";
    }
    else
    {
      $number2[] = "no";
    }
  }

  print_r($number2);
?>
嗯......它只有一半有效。只有已选中的复选框才会添加到数组中。所以,如果我选择“3”和“4”,我会得到这个:

Array ( [0] => yes [1] => yes )

处理数组中的复选框并验证它们的最佳方法是什么?

4 个答案:

答案 0 :(得分:4)

在表单提交时未选中的复选框不发送任何内容。这意味着如果选中了tagstags个复选框,则$ _POST数组中将没有<? if ($_SERVER['REQUEST_METHOD'] == 'POST') { if (isset($_POST['tags'])) { print_r($_POST['tags']); } } ?> 属性。

因此,您的代码应该是

yes

第一行验证POST实际发生了,第二行验证实际上有任何数据要转出。

对于你的其余代码,isset是没有意义的......因为如果选中了一个复选框只存在于POST数据中,那么在你的foreach循环中执行isset()是没有意义的 - 那就是如果没有复选框,那就没事了,所以根据定义,foreach中的所有内容都是isset()== true。

因此,您的foreach循环只会生成no个值,而不会生成<input type="checkbox" name="tags[1]" value="1" /> <input type="checkbox" name="tags[2]" value="2" /> etc...

更好的解决方法是在表单中指定数组键:

<?php
if (b blah blah blah verify post stuff) {
    for ($i = 1; $i <= $max_tags_allowed; $i++) {
      if (isset($_POST['tags'][$i])) {
          $message2[] = 'yes';
      } else {
          $message2[] = 'no';
      }
    }
}

然后

{{1}}

答案 1 :(得分:2)

或者,如果您希望复选框在未选中时也发送值,则可以在复选框之前添加隐藏输入字段:

<input type="hidden" name="tag[1]" value="off" />
<input type="checkbox" name="tag[1]" value="on />

因为复选框仅在设置时发送,但它会覆盖隐藏在HTML后面的隐藏,现在您将始终将tag[1]设置为“关闭”或“打开”,具体取决于是否是否检查了盒子。

答案 2 :(得分:0)

首先创建一个包含所有可能键的“no”的数组,如下所示:

$no = array(0 => "no", 1 => "no"); // or array("no", "no");

然后你可以得到你想要的数组:

$checkValues = array_flip($_POST["tags"]) + $no;

这样,$ _POST [“tags”]中的值将成为键,+运算符合并保留键的两个数组,如果它们存在于第一个数组中,也会省略第二个数组中的值。这样你就可以这样检查:

$fourthChecked = $checkValues[4] !== "no";

我认为它比其他答案简单得多。祝你好运!

答案 3 :(得分:0)

在checkboxes.php中:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>My form</title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script type="text/javascript" languaje="javascript">
$(document).ready(function() {
  $('.checkbox').click(function(){
    var values="";
    $('.checkbox:checked').each(function(index) {           
        values+=$(this).val();
        $('#tagsVal').val(values);
    });
  });
});
</script>
</head>
<body>
  <form action="checkboxes2.php" method="post">
   <input type="checkbox" name="tags1" value="1" class="checkbox"/>1<br><!--Notice the class="checkbox" attribute is important for the jquery function-->
   <input type="checkbox" name="tags2" value="2" class="checkbox"/>2<br>
   <input type="checkbox" name="tags3" value="3" class="checkbox"/>3<br>
   <input type="checkbox" name="tags4" value="4" class="checkbox"/>4<br>
   <input type="hidden" name="tagsVal" id="tagsVal" value="" />
   <input type="submit" value="Send" />
  </form>
</body>
</html>

那么你将在你的$ _POST ['tagVal']中获得你的价值。如果选中复选框1,3和4,您将获得一个字符串134。 在checkboxes2.php中,如果需要,您只需将字符串拆分为数组。

$arr1 = str_split($_POST['tagVal']);

此致 路易斯