在产品列表中,每个产品旁边都有一个复选框可用[]表示可用性。
$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。在这种情况下,我应该如何处理复选框数组?
答案 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行更新为true
或1
。如果在后续页面上加载用户取消选择产品,则PHP页面现在会收到3个已检查的产品。问题是如何知道哪一个被取消选择,因为它不在$_POST
中。因此,最简单的解决方案是更新products
表并首先将所有产品的avail
设置为null
作为单独的查询,然后执行问题中的现有代码以进行更新只有选中的产品再次发送到true
。
Edit2:是的,所以假设您一次最多可能更新40个产品,那么仅仅null
正在提交的页面上的40个是怎么回事?
答案 2 :(得分:0)
您可以创建一个包含id和status的JavaScript关联数组,您可以在每次更改时对其进行修改并将其发回。
否则使用隐藏字段设置值(隐藏输入字段,如果默认选中所有值,则默认选中所有值,当用户取消选中任何行时,将隐藏输入值设为0)
您可以获得用于在服务器端显示产品列表的相同数组,并将其循环以比较要删除的数据。
答案 3 :(得分:0)
这个选择的答案不符合我的需要,因为我不会进入但我的目的是:
<input type="checkbox" value="'.$x.'" name="sent[]" />
然后在循环中检查一堆东西我只是问:
if (in_array ($x, $thesentarray)) { /* Now I know x is one of the checked */ }
因此,我知道在处理循环中的每个项目时已经检查了有问题的特定项目。在此之前,我确保检查任何项目,并且如果只检查了一个,我将其转换为数组之前的
希望这个答案有助于某人