有没有一种方法可以有效地更新带有复选框的大表单?

时间:2014-08-22 04:13:37

标签: php checkbox

使用复选框有效地将大型表单更新为数据库时出现问题。

仅供参考:

<form action="save.php" method="post">
<?php
for {$i=0;$i<1000;$i++) {
echo '<input type="checkbox" name="product-' . $i . '">';
}
<input type="submit">
</form>


<?php
$posted_values = $_POST;
foreach($posted_values as $key=>$p) {
    $chkbox = $posted_values[$p];
    $update = 0;
    if ($chkbox == 'on') {
        $update = 1;
    }
   //Do some "expensive" checking for each posted value

   $save_dbarray[$key] = $update;
}

//Do the actual updating to databased based on array `save_dbarray`

有没有办法只将更改复选框添加到save_dbarray? (只有选中的框会被发布到$ _POST,但我希望未经检查的值也是更新的一部分,如果它们已经更改)我必须对每个发布的值进行一些昂贵的检查,因此

更新 我不希望循环遍历所有1000个复选框。我只想循环更改(从已检查到未选中或从未选中到已选中)复选框,但在上述情况下,$ posted_values只会返回已检查值的复选框(从未选中到已选中)

<?php
//I DONT want to have to do like this:
for {$i=0;$i<1000;$i++) {
    $prodnr = 'product-' . $i;
    $chkbox = $_POST[$prodnr];
    $update = 0;
    if ($chkbox == 'on') {
        $update = 1;
    }
   //Do some "expensive" checking for every value

   $save_dbarray[$key] = $update;
}

//Do the actual updating to databased based on array `save_dbarray`

1 个答案:

答案 0 :(得分:1)

您可以使用HTML array inputs and PHP执行相同操作。

示例代码如下所示。

<form action="save.php" method="post">
<?php
for ($i=0;$i<1000;$i++) {
    echo '<input type="checkbox" name="products[]" value="' . $i . '">&nbsp;'. $i .'<br>';
}
?>
<input type="submit">
</form>


<?php
print_r($_POST['products']); // Will contain your desired output
foreach($_POST['products'] as $i) {
    $save_dbarray[$i] = 'on'; // 'on' or whatever value if you need.

    // Actually you just need $_POST['products'], no need for this loop.
}

print_r($save_dbarray);
?>

修改

您需要循环浏览$_POST['products']才能找到新的已检查的内容,然后您需要遍历$already_selected以查找未经检查的内容。

    <?php

    // Select from db or something
    $already_selected = array(2,3);

    foreach($_POST['products'] as $i) {
        if(!in_array($i,$already_selected)){
            $save_dbarray[$i] = 'checked_update';
        }
    }
    foreach($already_selected as $j) {
        if(!in_array($j,$_POST['products'])){
            $save_dbarray[$j] = 'unchecked_update';
        }
    }
    print_r($save_dbarray);

    // Do db update and select again and update $already_selected to display the checked ones
?>

<form action="save.php" method="post">
<?php
    for ($i=1;$i<10;$i++) {
        $checked = in_array($i, $already_selected) ? 'checked' : '';

        echo '<input type="checkbox" name="products[]" value="' . $i . '" ' . $checked . '>&nbsp;'. $i .'<br>';
    }
?>
<input type="submit">
</form>