Как удалить одну запись из бд в 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">✖</button>
</form>
</div>
<? endforeach?>
Ответы (2 шт):
В 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.