【问题标题】:PHP - get checkbox value and change it if checked in databasePHP - 如果在数据库中选中,则获取复选框值并更改它
【发布时间】:2014-06-06 03:31:01
【问题描述】:

表格

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

}

【问题讨论】:

  • 是否必须在检查或按下按钮时发送
  • 提交表单时,按下按钮时出现

标签: php database checkbox


【解决方案1】:

虽然未选中的复选框在表单提交期间不会被序列化,但您可以简单地利用这个非常常见的技巧:

要确定复选框是否被选中,您可以在复选框本身之前添加&lt;input type="hidden" /&gt;,如下所示:

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

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

【讨论】:

  • 您可以简单地查询数据库两次以确定哪些 delete_user 字段设置为“N”,哪些设置为“Y”,而不是像这样打开您的 Web 应用程序。将这些信息存储在 $_SESSION 中的两个数组中,在显示实际表单之前,上述技术变得不必要(如果有的话,风险更大)。
  • 嗯,不,我只是做这样的事情:当涉及到通过选中的输入删除用户等场景时,我只是将这些复选框命名为&lt;input type="checkbox" name="toDelete[id]" /&gt;,其中 id 是在页面之前在 foreach 中生成的 id出现了。然后为了获得选定的 ID,我提交了一个表单,然后我只需检索选定的 ID,例如 array_keys($_POST['toDelete']),就是这样。根本不需要查询数据库!然后我们有了我们需要的东西 - 一个仅检查输入的数组(它们的 id 是准确的)
  • 嗯,不是“完全”。你的意思是一个查询而不是两个。问这个问题的人忘记提到的是,'N' 必须是 delete_user 字段的默认状态。否则,仅删除用户是不够的。您假设更新记录意味着删除。我不是。您的解决方案假设您只需要完成 1/2 的工作。我假设还有 1/2 的工作要做。
  • 换句话说,如果您打算将其从表中删除,那么更新 delete_user 字段的意义何在?他想更改值,而不是使用 DELETE 删除记录。因此,在尝试更新之前,您必须有一个系统来跟踪每条记录的 delete_user 字段的原始状态。
【解决方案2】:

一种方法是将复选框制作成一个数组并对其进行更改,使其返回组 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...

【讨论】:

  • @AnthonyRutledge:好点。实际上需要处理三种情况:不变;未选中,现在选中;并被选中,现在未选中。
【解决方案3】:

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

您不想邀请人们向您的应用提交垃圾。哦,有一种方法可以简单地通过更改 HTML 来做到这一点,但是当未选中该复选框时,我不希望我的后端接收该输入控件的任何内容!

【讨论】:

  • 我的新方法是捕获所有选中的复选框。在提交检查值之前,我将数据库中的所有值重置为N。所以在那之后,我将值设置为 Y 只有那些被选中的复选框。
  • 对您正在工作的场景适用的任何方法,都很好。切勿向您的应用提交不必要的数据。干得好。
  • @Ing.MichalHudak 然后接受这个答案
  • 仍在考虑其他方法。
  • @Ing.MichalHudak 你应该这样。正如你应该做的那样。
猜你喜欢
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多