PHP - 获取复选框值并在数据库中签入时更改它

时间:2014-06-05 14:44:06

标签: php database checkbox

id  name            level   delete_user

1   visitor         1       N
2   user            2       N
3   moderator       3       N
4   administrator   4       Y

然后我从数据库中获取数组:

$groups = array (
    array ( 'id' => 1, 'name' => 'visitor', 'level' => 1, 'delete_user' => 'N'),
    array ( 'id' => 2, 'name' => 'user', 'level' => 2, 'delete_user' => 'N'),
    array ( 'id' => 3, 'name' => 'moderator', 'level' => 3, 'delete_user' => 'N'),
    array ( 'id' => 4, 'name' => 'administrator', 'level' => 4, 'delete_user' => 'Y')
);

然后我创建简单的FORM来显示组的实际设置。

<form action="" method="post">
    <table class="groups">
        <thead>
            <tr>
                <td>name</td>
                <td>level</td>
                <td>delete user</td>
            </tr>
        </thead>
        <tbody>
            <?php foreach ($groups as $group) { ?>
                <?php 
                    $checkbox['delete_user_' . $group['id']] = 'N';
                    $checked = ($group['delete_user'] === 'Y') ? 'checked="checked"' : '';
                ?>    
                <tr>
                    <td><?php echo $group['name']; ?></td>
                    <td><?php echo $group['level']; ?></td>
                    <td>
                        <input type="checkbox" name="delete_user_<?php echo $group['id']; ?>" <?php echo $checked; ?> value="Y">
                    </td>
                </tr>
                <?php
            }
            ?>
        </tbody>    
    </table>
    <input type="submit" name="save_groups" value="Save" class="save_button">
</form>

问题:如何选中是否选中复选框,如果选中,则在数据库中更改?

我的工作:

这是一个原始的想法,但不是很漂亮......

<?php
if (isset($_POST['save_groups'])) {

    foreach ($_POST as $k => $v) {
        if (array_key_exists($k, $checkbox)) {
            $checkbox[$k] = $v;
        }
    }
    echo 'NEW';
    print_r($checkbox);
    echo '<hr>';
    foreach($checkbox as $k => $v) {
        $id = str_replace('delete_user_', '', $k);
        echo 'changing '. $id . ' to '. $v. '<br>';
        // changing value
        /**
         * $id int - id of group
         * $v string - value in delete_user ('Y' / 'N')
         */
        $this->change_value($id, $v);
    }

}

3 个答案:

答案 0 :(得分:3)

虽然在表单提交过程中未选中未选中的复选框,但您可以简单地利用这个非常常见的技巧:

要确定是否选中了复选框,您可以在复选框本身之前添加<input type="hidden" />,如下所示:

<input type="hidden" name="foo" value="0" />
<input type="checkbox" name="foo" value="1" />

因此,如果选中了复选框,$_POST['foo']将包含1,如果未选中,则$_POST['foo']将包含0

答案 1 :(得分:0)

一种方法是将复选框放入数组并更改它,以便返回组ID,而不仅仅是“Y”。 更新:根据Anthony的评论,您需要跟踪现有的支票状态:

<td>
    <?php if ($group['delete_user'] === 'Y') { ?>
    <input type="hidden" name="existing[]" value="<?php echo <?php echo $group['id']; ?>">
    <?php } ?>
    <input type="checkbox" name="delete_user[]" <?php echo $checked; ?> value="<?php echo <?php echo $group['id']; ?>">
</td>

现在你要在POST代码中做的就是:

<?php
$previously_checked = $_POST['existing'];
$group_ids = $_POST['delete_user'];
$updated_state = array();

// Check if previously-selected checkbox has been unchecked
foreach($previously_checked as $group_id) {
   if (!in_array($group_id, $group_ids)) {
      $updated_state[] = array('group_id' => $group_id, 'delete_user' => 'N');
   }
}
// Check for currently-selected checkbox was previously unchecked
foreach($group_ids as $group_id) {
   if (!in_array($group_id, $previously_checked)) {
      $updated_state[] = array('group_id' => $group_id, 'delete_user' => 'Y');
   }
}

// Do the update...

答案 2 :(得分:0)

不要做@Scorpion,@ Ken或我之前写的内容。只需根据id(主键)给你所有的复选框输入控件自己的名字(就像你开始做的那样),并在输入验证期间,如果记录的复选框已经成功提交,请使用isset($_POST['yourKeyHere'])来确定。如果是这样,请在关联记录上运行“肯定”UPDATE。如果没有,请在记录上运行“否定”更新。简单而甜蜜,如果不是有点浪费。此方法不会损害表单应用程序的安全性,但它可能会在您的表上运行不必要的更新(因为该字段已经是'N'或'Y')。

您不希望邀请其他人向您的应用提交垃圾。哦,有一种方法可以通过更改HTML来实现,但是当取消选中该复选框时,我不希望我的后端接收任何输入控件的内容!