Удаление данных MySQL
Как удалять данные из MySQL с помощью PHP: подготовленные запросы, WHERE, mysqli и PDO — пошаговое руководство.
Удаление данных в MySQL с помощью PHP
SQL-оператор DELETE удаляет одну или несколько строк из таблицы. В PHP этот оператор передаётся в MySQL через существующее соединение с базой данных, и — поскольку удаление необратимо — следует всегда фильтровать его с помощью WHERE и привязывать любое пользовательское значение через подготовленный запрос для защиты от SQL-инъекций.
В этом руководстве рассматривается полный рабочий процесс с расширением mysqli: подключение, формирование DELETE, безопасное выполнение, чтение количества затронутых строк и (опционально) закрытие соединения. Также показан эквивалентный подход с PDO, который предпочитают большинство современных проектов.
Оператор DELETE в двух словах
DELETE FROM table_name
WHERE column_name = 'value';table_name— таблица, из которой нужно удалить строки.- Предложение
WHEREопределяет, какие строки будут удалены. Строковые значения должны быть заключены в одинарные кавычки. - Если пропустить
WHERE, будут удалены все строки таблицы. Отменить это невозможно, поэтомуDELETEбезWHEREследует воспринимать так же, какTRUNCATE.
Если вы только начинаете работать с фильтрацией строк, сначала прочитайте PHP MySQL Where — тот же синтаксис условий применяется в DELETE, UPDATE и SELECT.
Шаг 1: Подключение к базе данных MySQL
Прежде чем удалять что-либо, необходимо открыть соединение. mysqli_connect() возвращает дескриптор соединения или false в случае ошибки:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database_name";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}Замените localhost хостом вашего сервера, учётные данные — вашими данными для входа, а database_name — именем базы данных, содержащей нужную таблицу. Подробнее о параметрах подключения читайте в PHP MySQL Connect.
Шаг 2: Безопасное удаление строки с помощью подготовленного запроса
Никогда не вставляйте пользовательское значение прямо в строку SQL — именно так происходят SQL-инъекции. Вместо этого поместите плейсхолдер ? в запрос и привяжите к нему значение. MySQL будет воспринимать это значение строго как данные, а не как SQL.
<?php
// 1. Prepare the DELETE with a placeholder
$stmt = mysqli_prepare($conn, "DELETE FROM users WHERE id = ?");
// 2. Bind the value: "i" = integer, "s" = string, "d" = double, "b" = blob
$id = 42; // e.g. the id of the record to remove
mysqli_stmt_bind_param($stmt, "i", $id);
// 3. Execute and report the result
if (mysqli_stmt_execute($stmt)) {
$deleted = mysqli_stmt_affected_rows($stmt);
echo "Deleted {$deleted} record(s).";
} else {
echo "Error deleting record: " . mysqli_stmt_error($stmt);
}
mysqli_stmt_close($stmt);Замените users и id именами вашей таблицы и столбца. Строка типов, передаваемая в mysqli_stmt_bind_param(), должна соответствовать привязанным значениям: используйте "i" для целочисленного id, как в примере выше, "s" — для текста.
mysqli_stmt_affected_rows() возвращает количество фактически удалённых строк. Если функция вернула 0, ни одна строка не совпала с условием WHERE — это полезно, чтобы различить «удалено» и «нечего удалять».
Шаг 3: Удаление с помощью PDO (современная альтернатива)
PDO работает аналогичным образом и переносим между движками баз данных. Именованные плейсхолдеры делают намерение более понятным:
<?php
$pdo = new PDO("mysql:host=localhost;dbname=database_name", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
$stmt->execute([':id' => 42]);
echo $stmt->rowCount() . " record(s) deleted.";rowCount() — это эквивалент affected_rows в PDO. Установка ERRMODE_EXCEPTION заставляет PDO выбрасывать исключения при ошибках вместо тихого сбоя.
Шаг 4: Закрытие соединения (опционально)
PHP закрывает соединение автоматически по завершении скрипта, но вы можете освободить его досрочно в длительно выполняющихся скриптах:
<?php
mysqli_close($conn);Типичные ошибки
- Забытый
WHERE.DELETE FROM users;очищает всю таблицу. Всегда дважды проверяйте условие перед выполнением на рабочих данных. - Формирование SQL путём конкатенации строк.
"DELETE FROM users WHERE name = '$name'"уязвимо к инъекциям. Используйте плейсхолдеры. - Предположение об удалении строки. Проверяйте
affected_rows/rowCount(); несовпадающийWHEREне удаляет ни одной строки, но при этом «выполняется успешно». - Удаление строк, от которых зависят другие таблицы. Внешний ключ с
ON DELETE RESTRICTзаблокирует удаление; сON DELETE CASCADE— удалит и связанные строки. Сначала изучите схему. - Мягкое удаление. Когда данные могут потребоваться обратно, добавьте флаг
is_deletedи используйтеUPDATE— смотрите PHP MySQL Update Data.
Заключение
Удаление данных в MySQL с помощью PHP — это чёткий четырёхэтапный процесс: подключиться, подготовить параметризованный DELETE, выполнить его и прочитать количество затронутых строк. Обязательные правила: всегда ограничивайте удаление с помощью WHERE и всегда привязывайте пользовательский ввод через подготовленный запрос. Для сравнения с другими операциями обратитесь к PHP MySQL Insert Data и PHP MySQL Select Data, а для углублённого изучения безопасности — к PHP MySQL Prepared Statements.