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

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

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

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

Для удаления данных возьмем использованную в прошлых темах таблицу Users со следующим определением:

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

Объектно-ориентированный стиль

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

<!DOCTYPE html>
<html>
<head>
<title>METANIT.COM</title>
<meta charset="utf-8" />
</head>
<body>
<h2>Список пользователей</h2>
<?php
$conn = new mysqli("localhost", "root", "mypassword", "testdb2");
if($conn->connect_error){
    die("Ошибка: " . $conn->connect_error);
}
$sql = "SELECT * FROM Users";
if($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>";
    $result->free();
} else{
    echo "Ошибка: " . $conn->error;
}
$conn->close();
?>
</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"]))
{
	$conn = new mysqli("localhost", "root", "mypassword", "testdb2");
	if($conn->connect_error){
		die("Ошибка: " . $conn->connect_error);
	}
    $userid = $conn->real_escape_string($_POST["id"]);
    $sql = "DELETE FROM Users WHERE id = '$userid'";
    if($conn->query($sql)){
		
		header("Location: index.php");
	}
	else{
		echo "Ошибка: " . $conn->error;
	}
    $conn->close();	
}
?>

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

Удаление из MySQL в PHP PDO

Процедурный стиль

Скрипт index.php:

<!DOCTYPE html>
<html>
<head>
<title>METANIT.COM</title>
<meta charset="utf-8" />
</head>
<body>
<h2>Список пользователей</h2>
<?php
$conn = mysqli_connect("localhost", "root", "mypassword", "testdb3");
if (!$conn) {
  die("Ошибка: " . mysqli_connect_error());
}
$sql = "SELECT * FROM Users";
if($result = mysqli_query($conn, $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>";
mysqli_free_result($result);
} else{
    echo "Ошибка: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
</body>
</html>

Скрипт delete.php:

<?php
if(isset($_POST["id"]))
{
	$conn = mysqli_connect("localhost", "root", "mypassword", "testdb3");
	if (!$conn) {
	  die("Ошибка: " . mysqli_connect_error());
	}
    $userid = mysqli_real_escape_string($conn, $_POST["id"]);
    $sql = "DELETE FROM Users WHERE id = '$userid'";
    if(mysqli_query($conn, $sql)){
		
        header("Location: index.php");
    } else{
        echo "Ошибка: " . mysqli_error($conn);
    }
    mysqli_close($conn);	
}
?>
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850