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

Последнее обновление: 07.06.2021

Для удаления данных применяется 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>METANIT.COM</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.

Удаление из MySQL в PHP PDO
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850