Pg delete: примеры (PHP)

Функция pg_delete: удаление данных в PostgreSQL
Раздел: Базы данных (PostgreSQL)
pg_delete(PgSql\Connection $connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC): string|bool
Функция pg_delete: основное описание

Функция pg_delete() в PHP предназначена для удаления записей из таблицы в базе данных PostgreSQL. Её используют, когда требуется выполнить операцию DELETE, используя ассоциативный массив условий, что упрощает формирование запроса по сравнению с ручным написанием SQL.

Аргументы функции
  • connection (ресурс PgSql\Connection) — обязательный параметр, представляющий соединение с сервером PostgreSQL.
  • table_name (string) — обязательный параметр, имя таблицы, из которой удаляются записи.
  • conditions (array) — обязательный ассоциативный массив, где ключи — названия столбцов, а значения — данные для условия WHERE. Удаляются строки, соответствующие всем парам ключ-значение.
  • options (int) — необязательный параметр, комбинация констант: PGSQL_DML_EXEC (выполнить немедленно), PGSQL_DML_ASYNC (асинхронное выполнение), PGSQL_DML_ESCAPE (экранировать специальные символы), PGSQL_DML_NO_CONV (не преобразовывать типы) и другие. По умолчанию используется PGSQL_DML_EXEC.

Функция возвращает true в случае успешного выполнения, false — при ошибке. Если используется флаг PGSQL_DML_ASYNC, возвращается ресурс запроса.

Простые примеры использования

Базовый пример удаления записи по условию.

<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$data = ['id' => 5];
$result = pg_delete($conn, 'users', $data);
if ($result) {
    echo 'Запись удалена';
} else {
    echo 'Ошибка удаления';
}
?>
Запись удалена

Пример с флагом экранирования.

<?php
$conn = pg_connect("host=localhost dbname=test");
$data = ['name' => "O'Reilly"];
$result = pg_delete($conn, 'books', $data, PGSQL_DML_ESCAPE);
var_dump($result);
?>
bool(true)

Асинхронное выполнение запроса.

<?php
$conn = pg_connect("host=localhost dbname=test");
$data = ['status' => 'inactive'];
$result = pg_delete($conn, 'orders', $data, PGSQL_DML_ASYNC);
if (is_resource($result)) {
    echo 'Запрос выполняется асинхронно';
}
?>
Запрос выполняется асинхронно
Похожие функции в PHP

В PHP для удаления данных из PostgreSQL доступны альтернативные методы.

Функция pg_query() позволяет выполнить произвольный SQL-запрос. Используется, когда условия удаления сложны или требуется полный контроль над запросом.

pg_query($conn, "DELETE FROM users WHERE id = 5");
PDO::exec

При использовании расширения PDO метод exec() выполняет SQL-запрос и возвращает количество удаленных строк. PDO предлагает единый интерфейс для работы с разными СУБД.

$pdo->exec("DELETE FROM users WHERE id = 5");
Сравнение

pg_delete() удобна для простых условий, где данные представлены в виде массива. pg_query() или PDO предпочтительнее для сложных запросов с JOIN или подзапросами.

Аналоги в других языках
Python (psycopg2)

В Python используется библиотека psycopg2. Удаление выполняется через курсор с параметризованным запросом.

import psycopg2
conn = psycopg2.connect("dbname=test")
cur = conn.cursor()
cur.execute("DELETE FROM users WHERE id = %s", (5,))
conn.commit()
JavaScript (Node.js с pg)

В Node.js с пакетом 'pg' операции выполняются через параметризованные запросы.

const { Client } = require('pg');
const client = new Client();
await client.connect();
await client.query('DELETE FROM users WHERE id = $1', [5]);
MySQL (SQL запрос)

В MySQL используется оператор DELETE. Прямого аналога pg_delete нет, условие формируется вручную.

DELETE FROM users WHERE id = 5;

Отличие PHP функции pg_delete() в том, что она абстрагирует формирование SQL, но ограничена простыми условиями равенства.

Типичные ошибки
Неверное соединение

Передача недействительного ресурса соединения приводит к ошибке.

<?php
$data = ['id' => 1];
$result = pg_delete(false, 'users', $data);
if (!$result) {
    echo pg_last_error();
}
?>
Warning: pg_delete() expects parameter 1 to be PgSql\Connection, bool given
Пустой массив условий

Пустой массив условий может привести к удалению всех строк, если СУБД не предотвратит это.

<?php
$conn = pg_connect("host=localhost dbname=test");
$result = pg_delete($conn, 'users', []);
?>
Будет выполнен запрос: DELETE FROM users, что удалит все записи.
Несуществующие столбцы

Указание несуществующего столбца в массиве условий вызывает ошибку на стороне базы данных.

<?php
$conn = pg_connect("host=localhost dbname=test");
$data = ['invalid_column' => 'value'];
$result = pg_delete($conn, 'users', $data);
echo pg_last_error($conn);
?>
ERROR: column "invalid_column" does not exist
Изменения в последних версиях PHP

В PHP 8.0 тип возвращаемого значения функции pg_delete() был изменен. Ранее функция возвращала ресурс (resource) в случае использования асинхронного режима, теперь возвращается объект PgSql\Result. При обычном выполнении по-прежнему возвращается bool.

В PHP 8.1 были улучшены сообщения об ошибках, теперь они выбрасывают исключения типа Exception в некоторых случаях, хотя функция в основном возвращает false при ошибках.

Параметр connection теперь ожидает объект PgSql\Connection вместо ресурса (resource), но приведение типов обратно совместимо.

Расширенные примеры
Удаление с использованием нескольких условий

Удаление записей, где несколько столбцов соответствуют значениям.

Пример php
<?php
$conn = pg_connect("host=localhost dbname=test");
$data = [
    'category' => 'old',
    'status' => 'expired'
];
$result = pg_delete($conn, 'articles', $data);
echo 'Удалено строк: ' . pg_affected_rows($conn);
?>
Удалено строк: 3
Удаление с возвратом данных

Использование флага PGSQL_DML_RETURNING для получения удаленных данных (требует PGSQL_DML_EXEC).

Пример php
<?php
$conn = pg_connect("host=localhost dbname=test");
$data = ['id' => 10];
$result = pg_delete($conn, 'users', $data, PGSQL_DML_EXEC | PGSQL_DML_RETURNING);
if ($result) {
    $rows = pg_fetch_all($result);
    print_r($rows);
}
?>
Array
(
    [0] => Array
        (
            [id] => 10
            [name] => Иван
        )
)
Удаление в транзакции

Группировка операций удаления в транзакции для обеспечения целостности.

Пример php
<?php
$conn = pg_connect("host=localhost dbname=test");
pg_query($conn, 'BEGIN');
$result1 = pg_delete($conn, 'logs', ['user_id' => 100]);
$result2 = pg_delete($conn, 'users', ['id' => 100]);
if ($result1 && $result2) {
    pg_query($conn, 'COMMIT');
    echo 'Транзакция выполнена';
} else {
    pg_query($conn, 'ROLLBACK');
    echo 'Транзакция откатана';
}
?>
Транзакция выполнена
Использование подготовленных выражений

Функция pg_delete внутренне может использовать подготовленные выражения при наличии соответствующих флагов, что повышает безопасность.

Пример php
<?php
$conn = pg_connect("host=localhost dbname=test");
$data = ['email' => 'user@example.com'];
$result = pg_delete($conn, 'subscribers', $data, PGSQL_DML_EXEC | PGSQL_DML_ESCAPE);
?>

В этом случае значения экранируются, предотвращая SQL-инъекции.

PHP pg_delete function comments

En
Pg delete Deletes records