Для удаления данных применяется 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.
Скрипт 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); } ?>