表
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);
}
}
答案 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来实现,但是当取消选中该复选框时,我不希望我的后端接收任何输入控件的内容!