Как удалить одну запись из бд в foreach?

Циклом выводятся записи из базы в виде блоков. При нажатии на кнопку удаления из бд удаляются все записи, а нужно чтобы удалялась только та запись, на которой нажата кнопка удаления. Помогите пожалуйста разобраться.

<? foreach($getCity as $key):
 
if (isset($_POST['del'])) {
    $del = mysqli_prepare($mysqli, "DELETE FROM city WHERE title =?");
    mysqli_stmt_bind_param($del, 's', $key['title']);
    mysqli_stmt_execute($del);
    $dell = mysqli_stmt_get_result($del);
    mysqli_stmt_close($del);
}
    

                      <div>
                          <h3><?=$key['title']?></h3>
                      </div>
                      <div id="btn-right-scp">
                         <form action="" method="post">
                          <button type="submit" name="del">&#10006;</button>
                          </form>
                      </div>
<? endforeach?>

Ответы (2 шт):

Автор решения: SigmoID

В foreach вы ничего не должны удалять. В foreach вы должны вывести ваши формочки, а потом направить POST запрос, в котором передать первичный ключ по которому вы собираетесь проводить удаление в вашей табличке, "проэкранировав" при этом данные запроса, чтобы обезопаситься от инъекций.

UPD. Почему вы обрабатываете POST запрос непосредственно рядом с версткой? Так делать нельзя.

Пример:

<?php
$connection = // Получаем объект соединения
$zaprosIzBD = // какой-то массив из запроса

if(isset($_POST['del']))
{
    //Елси запрос пришел -> вытаскиваем ключ, экранируем и удаляем
    $key = mysqli_real_escape_string($connection, $_POST['key']);
    mysqli_query($connection, "DELETE FROM city WHERE id ='{$key}' ");
}
?>

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<?php
foreach ($zaprosIzBD as $key => $value) {
?>
    <form action="/" method="POST">
        <p>Название : <?= $value['name']?></p>
        <input type="hidden" name="key" value="<?= $value['key']?>">
        <input type="submit" name="del" value="yes">
    </form>
<?php
}
?>
</body>
</html>
→ Ссылка
Автор решения: Не быть рабом на Руси

Необходимо разделять логику от представления. Поэтому в вашем случае должно быть 2 скрипта, как минимум. Первый это вывод записей, а второй удаление этих записей. В случае если index.php выводит данные, то например, delete.php удаляет записи.

Пример шаблона вывода:

<table>
  <? foreach($getCity as $key): ?>
    <tr>
      <td>
        <?=$key['title']?>
      </td>
      <td>
        <button 
          onclick="location.href='http://www.example.com/delete.php?title=<? $key['title'] ?>'"
          type="submit"
         >
           Удалить
         </button>
      </td>
    </tr>
  <? endforeach ?>
</table>

Тогда ваш скрипт для удаления записей будет выглядить примерно так:

<?php

if (isset($_GET['title'])) {
  $del = mysqli_prepare($mysqli, "DELETE FROM city WHERE title = ?");
  mysqli_stmt_bind_param($del, 's', $key['title']);
  mysqli_stmt_execute($del);
  $dell = mysqli_stmt_get_result($del);
  mysqli_stmt_close($del);
}

Теперь изменив адрес обранения на ваш сайт (например на localhost) и кликая по кнопке, вы будите удалять конкретную запись.

Это пример использует запрос типа GET. Данный вариант решения вашей проблемы не является безопасным и приведён в качестве обучения.

Чтобы аналогичное сделать через запрос типа POST необходимо использования JavaScript.

→ Ссылка