Php обновить базу данных, если флажок не установлен

таким образом, у меня есть динамически сгенерированная таблица

<tr>
    <td><?php echo $row['RequestID']?></td>
    <td><?php echo $row['FirstName'] . " " . $row['LastName']?></td>
    <td><?php echo $row['DateRequested']?></td>
    <td><?php echo $row['DateNeeded']?></td>
    <td><?php echo $row['TotalPrice']?></td>
    <td><?php echo $row['Company']?></td>
    <td><?php echo $row['Account']?></td>
    <td><?php echo $row['Brand']?></td>
    <td><?php echo $quantity?></td>
    <td><input type="checkbox" name="bill[]" value=<?php echo '"' . $row['RequestID'] . '"'; if($row['BillBack'] == "1") {echo "checked='checked'"; } ?></td>
</tr>

и я хочу обновить базу данных, когда строка отмечена или не отмечена.

if(isset($_POST['submit'])){//to run PHP script on submit
    if(!empty($_POST['bill'])){
    // Loop to store and display values of individual checked checkbox.
    foreach($_POST['bill'] as $selected){
    echo "hello";
    $sql2 = "UPDATE Requests SET BillBack = '1' WHERE RequestID = '$selected'";
    $result2 = $conn->query($sql2);

    }} elseif(empty($_POST['bill'])){
    // Loop to store and display values of individual checked checkbox.
    foreach($_POST['bill'] as $selected){
    echo "hello";
    $sql2 = "UPDATE Requests SET BillBack = '0' WHERE RequestID = '$selected'";
    $result2 = $conn->query($sql2);
    }}

         }

Сейчас. Оператор if работает как шарм. Для каждого флажка отправки эта запись обновляется. Проблема заключается в снятии флажков. Как видите, флажки можно найти, найдя то, что не пусто. Но, когда я удаляю этот восклицательный знак, он не эффективно делает обратное. Это также не работает, поскольку это собственное заявление if, как прямое другое заявление и проверка!isset. Это из-за того, как входные данные считаются проверенными? есть ли синтаксическая ошибка? Я сделал около 5 часов проверки ошибок, гугля, и я не мог понять это.
Спасибо ребята

1 ответ

  1. Его очень просто: просто обновите все ваши записи до 0, а затем установите 1 на тех, которые проверены.

    //to run PHP script on submit
    if(isset($_POST['submit'])){    
        // Setting everyone to 0
        $sql2 = "UPDATE Requests SET BillBack = '0'";
        $result2 = $conn->query($sql2);
    
        // Setting only those checked to 1
        if(!empty($_POST['bill'])){
            // Loop to store and display values of individual checked checkbox.
            foreach($_POST['bill'] as $selected){
                echo "hello";
                $sql3 = "UPDATE Requests SET BillBack = '1' WHERE RequestID = '$selected'";
                $result3 = $conn->query($sql3);
            }
        }
    }
    

    РЕДАКТИРОВАТЬ:

    Имейте в виду, что наличие запросов внутри foreach может вызвать перегрузку на сервере, чтобы избежать этого, вы можете хранить идентификаторы записей, которые вы хотите обновить, и использовать его только в одном запросе за пределами foreach:

    //to run PHP script on submit
    if(isset($_POST['submit'])){
        // Setting everyone to 0
        $sql2 = "UPDATE Requests SET BillBack = '0'"; // Maybe add a WHERE clause, like BizzyBob pointed out
        $result2 = $conn->query($sql2);
    
        // Setting only those checked to 1
        if(!empty($_POST['bill'])){
    
            // Initialize an array of selected ids
            $selected_ids = array(); 
    
            // Loop to store individual checked checkboxes on array        
            foreach($_POST['bill'] as $selected){
                $selected_ids[] = $selected;
            }
    
            // Get the ids separated by comma
            $in_clause = implode(", ", $selected_ids);
    
            // Do only one sql query
            $sql3 = "UPDATE Requests SET BillBack = '1' WHERE RequestID in (".$in_clause.")";
            $result3 = $conn->query($sql3);
        }
    }