Флажки проверяются случайным образом

У меня вопрос.

У меня есть страница с сотнями флажков, которые создаются с помощью базы данных. Поэтому, когда база данных возвращает 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, но иногда это случайным образом проверяет флажки ?!

В вашей логике есть следующие недостатки: ваш массив $_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); } } 

Или, если у вас есть массив всех комнат, вы можете перебирать их, чтобы проверить, проверены ли они:

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