PHP foreach POST php表单中的复选框

时间:2012-09-16 19:00:09

标签: php forms loops

我已经制作了动态表单,可以使用foreach($_POST)技术通过单个提交按钮更新整个选项列表,但出于某种原因,我遇到了与复选框输入相同的问题。< / p>

无论我取消选择哪个复选框,都会评估复选框并将表单中的最后一行视为我取消选择的复选框。换句话说,无论我取消选择哪个复选框,POST脚本都将确定取消选中最后一个复选框。这是我以前从未见过的非常奇怪的效果。

例如,此PHP数组提取会生成一系列库存项目,并提供隐藏项目的选项。

****请注意,我还没有提出安全措施。当我在逻辑上看到这项工作时,我会消毒一切。我现在甚至不想使用REQUEST,但我想先看看这项工作。

<form action="update.php" method="post">
while($row=mysql_fetch_array($histresult))
    {
                echo '<tr height = "50px">';
                //We grab the product id as well as everything else we need.
                $customer_id= $row['customer_id'];
                $product_id= $row['product_id'];
                $link = $row['image_path'];
                $name = $row['name'];
                $sku_item_number = $row['sku_item_number'];
                $suggested_quantity = $row['suggested_quantity'];
                $sales_info = $row['sales_info'];
                $item_id = $row['id_product_customer_suggested_qty'];
                $customer_level = $row['level'];


                //Visibility Option Goes here
                echo '<td>';
                echo '<input name="i" type="hidden" value="'.$i.'">
                <input name="product_id[]" type="hidden" value="'.$product_id.'">
                <input name="customer_id[]" type="hidden" value="'.$customer_view.'">
                <input name="customer_level[]" type="hidden" value="'.$customer_level.'">';

                echo '<input name="cart_visible[]" type="checkbox" value = "1"';
                if (!in_array($product_id, $hidden))
                {
                    echo 'checked = "checked"';
                }
                echo '></td>';
                echo '<td>';
                echo '<a href="displayitem.php?product_id='.$product_id.'">'.$name.'</a>';
                 echo '</td>';
                 echo '<td>'.$sku_item_number.'</td>';
                 echo '<td>'.$product_id.'</td>';
                 echo '<td>'.$sales_info.'</td>';
                 echo '<td>'.$suggested_quantity.'</td>';
                         echo '</tr>';
<input type="submit" name="button" id="button" value="Submit">
</form>

//And then update.php looks like this:

$j=0;
foreach($_REQUEST['product_id'] as $key=>$product_id)
{ 
    echo 'j value is '.$j.'<br>';
    $customer_id = $_REQUEST['customer_id'][$key];
    $customer_level = $_REQUEST['customer_level'][$key];
    $price_level_id = $_REQUEST['price_level_id'][$key];
    $cart_visible = $_REQUEST['cart_visible'][$key];

    if ($cart_visible != 1)
    {
        $cart_visible = 0;
    }
    //echo 'Customer ID is '.$customer_id.'<br>';
    echo 'Testing - Product ID is '.$product_id.'<br>';
    //echo 'Customer Level is '.$customer_level.'<br>';
    //echo 'Price Level ID is '.$price_level_id.'<br>';
    echo 'Cart visibility selection is '.$cart_visible.'<br>';
}

回显调试行显示无论我取消选择哪一行,它都会将表单中的最后一行视为取消选择的行。例如,如果有十行并且我取消选择行1,3和8的复选框,则表单将像用户取消选择第8,9和10个复选框一样。为什么它会专门用于复选框?

1 个答案:

答案 0 :(得分:2)

当您发布取消选中的复选框时,它不会发送其“值”,因此不在POST中。

如果复选框是数组名称的一部分,并且有10个复选框,则取消选择3,POST中的结果数组将只有7个索引0到6。

要解决此问题,请为复选框命名一个值...

我可能没有正确理解您的代码,但有类似的东西

$ite=0;    
while($row=mysql_fetch_array($histresult)){
      //....
      echo '<input name="cart_visible['.$ite.']" type="checkbox" value = "1"';
      //....
      $ite++;
}

现在,假设您取消选中复选框3,这意味着第3个索引不会出现。 $ cart_visible部分代码应该看起来像这样

//if checkbox value exists, make $cart_visible to that value, else make $cart_visible to 0
$cart_visible = isset($_REQUEST['cart_visible'][$key])?$_REQUEST['cart_visible'][$key]:0;

并删除$ cart_visible

的if语句