我有一个带有数据库生成的复选框的页面。当我们按下复选框并提交它时,它工作正常,它正在数据库中更新。但是当我尝试取消选中“1”复选框时,它会检出所有选中的复选框。
查询:
if(isset($_POST['submit'])){
foreach ($_POST['untrain'] as $room_id => $user_id) {
// This query needs protection from SQL Injection!
$user_id;
$untrainQuery = "UPDATE room_users SET trained = '1' WHERE user_id = $user_id AND room_id = $room_id";
$db->update($untrainQuery);
}
}
if(isset($_POST['submit'])){
foreach ($_POST['amk'] as $room_id => $user_id) {
// This query needs protection from SQL Injection!
$user_id;
$untrainedQuery = "UPDATE room_users SET trained = '0' WHERE user_id = $user_id AND room_id = $room_id";
$db->update($untrainedQuery);
}
}
复选框:
<?php
if($room->trained == 1)
{ ?>
<input type='hidden' value="<?php echo $room->user_id; ?>" name="amk[<?php echo $room->room_id; ?>]">
<input type='checkbox' value="<?php echo $room->user_id; ?>" name="trained[<?php echo $room->room_id; ?>]" checked>
<?php echo "Y"; }
else{ ?>
<input type='checkbox' value="<?php echo $room->user_id; ?>" name="untrain[<?php echo $room->room_id; ?>]">
<?php echo "N";
}?>
</td>
<Td><?php
if($room->active == 1) {
?> <input type='checkbox' name="<?php echo $room->room_id; ?>" checked>
<?php echo "Active"; }
else { ?>
<input type='checkbox' name="<?php echo $room->room_id; ?>"
<?php echo "Inactive"; } ?>
我在复选框之前使用了“隐藏”输入的技巧,但唯一的问题是它无法正常工作。当我点击它时,它会将所有复选框重置为0。
答案 0 :(得分:0)
我认为您错过了组合复选框+隐藏输入的工作原理。
所以在这里你可以自由地受到this answer的启发:
<input id="foo" name="foo" type="checkbox" value="1" />
<input name="foo" type="hidden" value="0" />
看起来你知道,如果你使用这个技巧,如果未选中该复选框,它将不会出现在帖子中。因此,要欺骗表单,我们将始终添加隐藏字段。如果选中该复选框,那么它将包含在帖子中的事实将覆盖隐藏输入的值。
所以针对您的具体问题:
<td>
<input type="checkbox" value="1" name="trained[<?php echo $room->room_id; ?>_<?php echo $room->user_id; ?>]" <?php echo ($room->trained == 1) ? ' checked' : '' ?> /> Trained
<input type="hidden" value="0" name="trained[<?php echo $room->room_id; ?>_<?php echo $room->user_id; ?>]"/>
</td>
请注意在代码<?php echo ($room->trained == 1) ? ' checked' : '' ?>
的这一部分使用ternary operator,在编写html模板时我可能会使用它。
请注意名称trained[<?php echo $room->room_id; ?>_<?php echo $room->user_id; ?>]
上的技巧,因为我们无法将user_id设置为输入值。
然后是处理部分:
if ( isset ( $_POST['submit'] ) ) {
foreach ( $_POST['trained'] as $ids => $value ) {
// This query needs protection from SQL Injection!
// ^ good point, on which I would suggest you using PDO and prepared statement :)
list($room_id,$user_id) = explode('_',$ids);
// ^ now need to explode the name on the underscore to get both user_id and room_id cf the trick above
$untrainQuery = "UPDATE room_users SET trained = '$value' WHERE user_id = $user_id AND room_id = $room_id";
$db->update ( $untrainQuery );
}
}
洗涤,冲洗,重复所需的每个复选框,你应该好好去。