2015-04-07 36 views
0

我有一個帶有數據庫生成的複選框的頁面。當我們按複選框並提交它時,它工作正常,它正在數據庫中更新。但是當我試圖取消選中「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

@ b.enoit.be編輯:) –

回答

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' : '' ?>其編寫HTML模板時,我可能會使用大量的這部分使用ternary operator的。

請注意,的技巧的名稱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); 
    } 
} 

洗滌,漂洗,重複每一個複選框,你需要和你應該是好去。