Удаление данных 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
: