W3docs

Удаление данных 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.

Practice

Практика
Что необходимо для удаления данных из MySQL в PHP?
Что необходимо для удаления данных из MySQL в PHP?
Was this page helpful?