Функция isset отправляет все кнопки внутри while l oop PHP - PullRequest
0 голосов
/ 04 августа 2020

У меня такая проблема, когда кнопка отправки внутри while l oop повторно выполняет while l oop.

PHP:

$query1 = $con->query("SELECT * FROM room");
if($query1->num_rows > 0) {
    while($row1 = $query1->fetch_array()) {
        $idroom = $row1['idroom'];

        echo "<tr>";
        echo "<td> $idroom </td>";
        echo "<td> <form method='POST'> <input type='submit' name='delete' value='DELETE'> </form></td>";
        echo "</tr>";

        if(isset($_POST['delete'])) {
            $query2 = $con->query("DELETE FROM room WHERE idroom='$idroom'");
        }
    }
}

таблица: [1]: https://i.stack.imgur.com/dujps.png

проблема в том, что когда я нажимаю кнопку удаления, она просто удаляет всю комнату ВМЕСТО той комнаты, которую я хочу удалить. Я считаю, что программа думает, что я нажимаю всю кнопку удаления сразу из-за функции isset.

вещей, которые пробовал ive:

  • замена строки $ query2 внутри isset с echo $idroom;, а на выходе room1room2room3. что означает, что программа считает, что я нажимаю все кнопки одновременно.

Ответы [ 2 ]

1 голос
/ 04 августа 2020

В этом коде есть много ошибок, не в последнюю очередь то, что он невероятно небезопасен и уязвим для инъекций. Вы должны прочитать о подготовленных операторах перед тем, как go продолжить. Учебников и ТАК-ответов на это нет конца, поэтому я не буду их здесь описывать. В интересах помощи новому программисту (я был новичком не так давно, go) я укажу, что, по моему мнению, здесь идет не так:

  1. $query1 = $con->query("SELECT * FROM room");

Это запускается каждый раз при запуске скрипта. Это ключевой момент. Если вы загружаете страницу или отправляете сообщение, это всегда происходит. Что приводит к:

if($query1->num_rows > 0) { while($row1 = $query1->fetch_array()) { ...

Вы запускаете l oop, перебирая every запись. Обратите внимание на every.

Итак, для каждой отдельной записи вы затем проверяете:

if(isset($_POST['delete'])) {...

Здесь удаляются ваши записи и на что CBroe указал в своем комментарии. Вы полагаете (я думаю), что проверяете удаление этой отдельной записи, однако вы проверяете только isset($_POST['delete']) и делаете это для EVERY записи. Помните, что переменная POST существует до конца сценария или до удаления. Итак, нажав кнопку «Удалить» и отправив это значение _POST, вы передаете это условие для каждой записи в вашем l oop.

  • Вы должны немного переварить это перед тем, как продолжить, так как это распространенная ошибка начинающих программистов. Помните, что компьютер читает и выполняет сценарий по порядку, помните, что он также делает EXACTLY то, о чем вы его просите, и не более или менее. Пример classi c предназначен для описания приготовления чашки кофе. Если я скажу вам: `` Поставьте чайник, налейте кофе в чашку, налейте воды, добавьте молока '', вы сделаете кофе, но если вы скажете это компьютеру, вы закончите, в лучшем случае с компьютером, носящим чайник ищет чашку для кофе и говорит, что молоко - это не число.

Итак, решение. Что ж, я не буду писать вам это, есть разные варианты. Вы должны передать какой-то идентификатор сообщению, который указывает c на нужную запись, а затем вам нужно проверить это, например, isset POST[delete] && isset(POST['room_id']). Затем вам нужно решить, где лучше всего это делать, в начале сценария, в другом сценарии, возможно, не внутри al oop (что редко является признаком хорошего программирования). Если вы собираетесь удалить запись, вам, вероятно, следует сделать это до создания для нее вывода. (зачем собирать запись только для того, чтобы потом удалить ее, это эффективно?).

Если вы действительно должны сделать это внутри al oop, тогда вам нужна какая-то проверка, что идентификатор комнаты такой же в качестве идентификатора значения сообщения перед запуском удаления.

Надеюсь, это будет полезно, но убедитесь, что вы изучаете и начинаете использовать подготовленные операторы в срочном порядке - действительно нет оправдания, чтобы не сделать это в 2020 году

0 голосов
/ 04 августа 2020

В вашем коде вы не следовали базовой структуре c. Используйте JS для события щелчка при редактировании / удалении и используйте ajax призыв к выполнению действий.

Вот одно решение для вашего кода на основе ваша паста, это не стандартный код, но помогает вам решить проблему.

$query1 = $con->query("SELECT * FROM room");
if($query1->num_rows > 0) {
    while($row1 = $query1->fetch_array()) {
        $idroom = $row1['idroom'];

        $tr = "<tr>";
        $tr .= "<td> $idroom </td>";
        $tr .= "<td><form method='POST'>";
        $tr .= "<input type='hidden' name='room_id' value='".$idroom."'>";
        $tr .= "<input type='submit' name='delete' value='DELETE'> </form></td>";
        $tr .= "</tr>";

        echo $tr;
    }
}

if(isset($_POST['delete'])) {
  $roomId = $_POST['room_id'];
  $query2 = $con->query("DELETE FROM room WHERE idroom='$roomId'");
}
...