2015-04-07 3 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> 

Пожалуйста, обратите внимание на использование ternary operator на этой части кода <?php echo ($room->trained == 1) ? ' checked' : '' ?>, который я могу использовать много при написании шаблона 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); 
    } 
} 

вымыть, ополоснуть, повторите для каждого CheckBox вам нужно, и вы должны быть хорошо идти.

Смежные вопросы