php数组的复选框

时间:2011-07-05 12:04:26

标签: php arrays checkbox

在产品列表中,每个产品旁边都有一个复选框可用[]表示可用性。

$listvals=$_POST['avail'];
$n=count($listvals);

for($i=0; $i<count($_POST['avail']); $i++) {
        $avail= ($listvals[$i]<>'' ? 1 : 0);
    $query_update = "update products set avail=$avail where id ='".$listvals[$i]."'";
    $update = mysql_query($query_update, $connection) or die(mysql_error());
}

到目前为止,我在使用以下更新查询检查所选产品时很好,但是当我想取消选择产品(标记为不可用)时,它会忽略产品,因为很明显{ {1}}值为null / 0。在这种情况下,我应该如何处理复选框数组?

4 个答案:

答案 0 :(得分:2)

解决此问题的一种方法是为每个复选框使用隐藏的表单字段。

例如

替换

<input name="avail[<?php echo $product_id?>]" type="checkbox" value="1" />

使用

<input name="avail[<?php echo $product_id?>]" type="hidden" value="0" />
<input name="avail[<?php echo $product_id?>]" type="checkbox" value="1" />

这样你肯定会在你的数组中返回0或1。如果勾选了复选框,您将得到1.否则它将默认为隐藏字段的值 - 0.请注意,这仅在您使用阵列的固定索引时才有效。换句话说

<input name="avail[]" type="hidden" value="0" />
<input name="avail[]" type="checkbox" value="1" />

无效,因为它会为数组添加两个选项。

更新:添加此内容以澄清

然后你稍微修改你的php:

$listvals=$_POST['avail'];

foreach($listvals as $product_id => $available) {
    $query_update = "update products set avail=$available where id ='".$product_id."'";
    $update = mysql_query($query_update, $connection) or die(mysql_error());
}

一个可能更简单的方法,如果您只查找可用的产品,则预先运行另一个sql脚本,将所有可用性设置为0 / false / null - 从根本上使您的所有产品都不可用添加正确的。

快速粗略的现成版本:

$listvals=$_POST['avail'];
$n=count($listvals);

/*
 * add this
 */
mysql_query('update products set avail = 0');

for($i=0; $i<count($_POST['avail']); $i++) {
        $avail= ($listvals[$i]<>'' ? 1 : 0);
    $query_update = "update products set avail=$avail where id ='".$listvals[$i]."'";
    $update = mysql_query($query_update, $connection) or die(mysql_error());
}

希望这有帮助

答案 1 :(得分:0)

在我看来,最简单的方法是将所有产品的可用性设置为null,然后将id的可用性更新为true/1。在$_POST。替代方案需要将先前选择的产品与新选择的产品进行比较。根据经验,这需要更多测试和更多代码,因此可能出错。

修改

因此,我假设用户可以检查HTML <form>上的一个或多个框,这些框提交到处理表单的PHP页面并更新products表中的多行(每个表一个)复选框)。因此,用户会检查6个框中的4个,以便将6行中的4行更新为true1。如果在后续页面上加载用户取消选择产品,则PHP页面现在会收到3个已检查的产品。问题是如何知道哪一个被取消选择,因为它不在$_POST中。因此,最简单的解决方案是更新products表并首先将所有产品的avail设置为null作为单独的查询,然后执行问题中的现有代码以进行更新只有选中的产品再次发送到true

Edit2:是的,所以假设您一次最多可能更新40个产品,那么仅仅null正在提交的页面上的40个是怎么回事?

答案 2 :(得分:0)

  1. 您可以创建一个包含id和status的JavaScript关联数组,您可以在每次更改时对其进行修改并将其发回。

  2. 否则使用隐藏字段设置值(隐藏输入字段,如果默认选中所有值,则默认选中所有值,当用户取消选中任何行时,将隐藏输入值设为0)

  3. 您可以获得用于在服务器端显示产品列表的相同数组,并将其循环以比较要删除的数据。

答案 3 :(得分:0)

这个选择的答案不符合我的需要,因为我不会进入但我的目的是:

 <input type="checkbox" value="'.$x.'" name="sent[]" /> 

然后在循环中检查一堆东西我只是问:

if (in_array ($x, $thesentarray)) { /* Now I know x is one of the checked */ }

因此,我知道在处理循环中的每个项目时已经检查了有问题的特定项目。在此之前,我确保检查任何项目,并且如果只检查了一个,我将其转换为数组之前的

希望这个答案有助于某人