Полный цикл в digital

Удаление данных PDO

Для удаления данных применяется sql-команда DELETE:

DELETE FROM Таблица
WHERE столбец = значение

Для удаления данных также может применяться метод exec() объекта PDO. Например, возьмем использованную в прошлых темах таблицу Users со следующим определением:

CREATE TABLE Users (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), age INTEGER)

Удалим из этой таблицы строку, где id = 5:

<?php
try {
$conn = new PDO("mysql:host=localhost;dbname=test", "root", "mypassword");
$sql = "DELETE FROM Users WHERE id = 5";
$affectedRowsNumber = $conn->exec($sql);
echo "Удалено строк: $affectedRowsNumber";
}
catch (PDOException $e) {
echo "Database error: " . $e->getMessage();
}
?>

Результат метода $conn->exec() в данном случае количество удаленых строк. Однако опять же поскольку значение столбца, на основе которого происходит удаление, нередко приходит извне, то в этом случае лучше использовать параметризацию.

Итак, определим для вывода всех объектов из БД скрипт index.php:

<!DOCTYPE html>
<html>
<head>
<title>hmarketing.ru</title>
<meta charset="utf-8" />
</head>
<body>
<h2>Список пользователей</h2>
<?php
try {
$conn = new PDO("mysql:host=localhost;dbname=testdb1", "root", "mypassword");
$sql = "SELECT * FROM Users";
$result = $conn->query($sql);
echo "<table><tr><th>Имя</th><th>Возраст</th><th></th></tr>";
foreach($result as $row) {
echo "<tr>";
echo "<td>" . $row["name"] . "</td>";
echo "<td>" . $row["age"] . "</td>";
echo "<td><form action='delete.php' method='post'>
<input type='hidden' name='id' value='" . $row["id"] . "' />
<input type='submit' value='Удалить'>
</form></td>";
echo "</tr>";
}
echo "</table>";
}
catch (PDOException $e) {
echo "Database error: " . $e->getMessage();
}
?>
</body>
</html>

В таблицы для каждой строки определена форма, которая посылает данные в POST-запросе скрипту delete.php. Чтобы передать в delete.php идентификатор удаляемого объекта, на форме определено скрытое поле для хранения id объекта.

Обратите внимание, что в данном случае применяется не ссылка для удаления типа:

<a href="http://адрес_нашего_сайта/delete.php?id=1">Удалить<a />

которая оправляет данные в GET-запросе, а именно форма, которая отправляет данные в POST-запросе. Почему? Подобные GET-запросы потенциально небезопасны. Допустим, нам пришло электронное письмо, в которое была внедрена картинка посредством тега:

<img src="http://адрес_нашего_сайта/delete.php?id=1" />

В итоге при открытии письма 1-я запись в таблице может быть удалена. Уязвимость касается не только писем, но может проявляться и в других местах, но смысл один - GET-запрос к скрипту, который удаляет данные, несет потенциальную уязвимость.

Теперь определим сам скрипт delete.php, который будет выполнять удаление:

<?php
if(isset($_POST["id"])) {
try {
$conn = new PDO("mysql:host=localhost;dbname=testdb1", "root", "mypassword");
$sql = "DELETE FROM Users WHERE id = :userid";
$stmt = $conn->prepare($sql);
$stmt->bindValue(":userid", $_POST["id"]);
$stmt->execute();
header("Location: index.php");
}
catch (PDOException $e) {
echo "Database error: " . $e->getMessage();
}
}
?>

В данном случае скрипт получает через POST-запрос значение id и по этому идентификатору выполняет удаление. После чего происходит переадресация на скрипт index.php:

Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг