复选框正在退房

时间:2015-04-07 19:57:58

标签: php mysql sql html5 mysqli

我有一个带有数据库生成的复选框的页面。当我们按下复选框并提交它时,它工作正常,它正在数据库中更新。但是当我尝试取消选中“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。

1 个答案:

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

洗涤,冲洗,重复所需的每个复选框,你应该好好去。