我有一个问题。
我有一个包含数百个随数据库生成的复选框的页面。因此,当数据库返回1时,检查它否则为0并且不检查。当我尝试检查复选框并尝试将其更新到数据库时,一些复选框随机检出..
代码:
这是查询
if(isset($_POST['submit'])){
foreach ($_POST['untrain[{$room->room_id}]'] as $room_id) {
// This query needs protection from SQL Injection!
$user_id;
$room_id;
$untrainQuery = "UPDATE room_users SET trained = '1' WHERE room_id = $room_id";
$db->update($untrainQuery);
}
}
这些是复选框:
<?php
if ($room->trained == 1) {
?> <input type='checkbox' value="<?php
echo $room->user_id;
?>" name="trained[<?php
echo $room->room_id;
?>]" checked> <?php
echo "Y";
} else if ($room->trained == 0) {
?> <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";
}
?>
所以当数据库返回1时,复选框被检查,否则它是0,所以取消选中..所以我的问题是为什么它是随机检出复选框?
我想检查复选框以使用1更新数据库,但有时会随机选中复选框?!
答案 0 :(得分:0)
您的逻辑存在以下缺陷:您的$_POST
数组具有键untrain
,其值为内部键组room_id
(因为它们位于复选框名称中)和值user_id
(复选框的值)。在你的foreach循环$room_id
已经确定了复选框的值,这些复选框确实是user_ids
。除此之外你应该迭代$_POST['untrain']
,我不知道你从哪里拿到那把钥匙$room->room_id
。
我会改为:
if(isset($_POST['submit'])){
foreach ($_POST['untrain'] as $room_id => $user_id) {
//sanitize $room_id
$untrainQuery = "UPDATE room_users SET trained = '1' WHERE room_id = $room_id";
$db->update($untrainQuery);
}
}
或者,如果你有一个包含所有room_id的数组,你可以迭代它们来检查是否检查了哪些:
if(isset($_POST['submit'])){
foreach ($room_ids as $room_id) {
//sanitize $room_id
if(isset($_POST["untrain[{$room_id}]"]){//that is, if it was checked
$trained = 1;
}else{
$trained = 0;
}
$untrainQuery = "UPDATE room_users SET trained = $trained WHERE room_id = $room_id";
$db->update($untrainQuery);
}
}