【问题标题】:php array of checkboxesphp 复选框数组
【发布时间】:2011-09-28 18:26:58
【问题描述】:

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

$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());
}

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

【问题讨论】:

    标签: php arrays checkbox


    【解决方案1】:

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

    编辑:

    因此,我假设用户可以选中 HTML &lt;form&gt; 上的一个或多个框,该框将提交到 PHP 页面,该页面处理表单并更新 products 表中的多行(每个复选框一个)。因此,用户选中了 6 个框中的 4 个,因此您将 6 行中的 4 行更新为 true1。如果在后续页面加载中用户取消选择产品,PHP 页面现在会收到 3 个选中 产品。问题是如何知道哪一个被取消选择,因为它不在$_POST 中。因此,最简单的解决方案是更新products 表并将所有产品的avail 设置为null 作为单独的查询,然后执行问题中的现有代码,仅将选中的产品更新为@ 987654333@再次。

    Edit2:好吧,假设您可能一次更新多达 40 个产品,那么 nulling 提交页面上的任何 40 个怎么样?

    【讨论】:

    • 我不确定我是否理解你的比较方法,可以举一个简单的例子吗?
    • 是的,它应该是这样工作的。我不能将所有值都设置为 null,因为我的数据库中有大约 400 种产品,它们显示在 40 页中,将它们全部设置为 0/null,然后仅更新我选择的那些会导致其余产品出现问题的产品。
    【解决方案2】:
    1. 您可以创建一个带有 id 和状态的 JavaScript 关联数组,您可以在每次更改时对其进行修改并将其发回。

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

    3. 您可以获得与在服务器端显示产品列表相同的数组,然后循环比较哪些被删除。

    【讨论】:

    • 我不确定我是否理解你的第二种方法,可以举一个简单的例子吗?
    【解决方案3】:

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

    例如

    替换

    <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());
    }
    

    希望对你有帮助

    【讨论】:

    • 好的,我现在掌握了它......我唯一需要更好地理解的是你说的部分“请注意,这只有在你使用固定索引时才有效数组”。如何使用固定索引?至于将它们全部设置为 null 然后更新的选项,请在 andyb 的建议下阅读我下面的评论。
    • 老实说,我认为您可能无论如何都是为了确定要更新哪些记录。如果你的复选框标签看起来像 那么你应该没问题。只是如果方括号内没有任何内容,您就会遇到问题
    • 是的,这就是我设置复选框值的方式。您建议我使用辅助数组来确定要更新哪些行?
    • 如果您只想更新记录的子集,您确实可以使用第二种方法。我能看到的唯一问题是您的产品总是需要按 id 订购。或者,您可以将要更新的 id 转储到隐藏的表单字段中,用 ; 分隔它们。 (或您选择的任何其他符号;))然后再次爆炸。如果您确实想使用第一种方法,我已经更新了我的答案,以了解您需要在 php 中更改哪些内容以使用关联数组索引
    • 哎呀-认为我们在那里有一个交叉的评论!在发布评论后,我意识到您的 php 暗示您使用的是复选框的值而不是数组的索引,因此我用所需的 php 更改更新了我的答案。在隐藏的表单字段中转储要更新的 id 列表的想法仍然有效
    【解决方案4】:

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

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

    然后在检查我刚问的一堆东西的循环中:

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

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

    希望这个答案对某人有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2011-08-26
      • 2011-09-23
      • 1970-01-01
      相关资源
      最近更新 更多