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