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