Pg delete: примеры (PHP)
pg_delete(PgSql\Connection $connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC): string|boolФункция 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 для удаления данных из PostgreSQL доступны альтернативные методы.
Функция pg_query() позволяет выполнить произвольный SQL-запрос. Используется, когда условия удаления сложны или требуется полный контроль над запросом.
pg_query($conn, "DELETE FROM users WHERE id = 5");При использовании расширения PDO метод exec() выполняет SQL-запрос и возвращает количество удаленных строк. PDO предлагает единый интерфейс для работы с разными СУБД.
$pdo->exec("DELETE FROM users WHERE id = 5");pg_delete() удобна для простых условий, где данные представлены в виде массива. pg_query() или PDO предпочтительнее для сложных запросов с JOIN или подзапросами.
В Python используется библиотека psycopg2. Удаление выполняется через курсор с параметризованным запросом.
import psycopg2
conn = psycopg2.connect("dbname=test")
cur = conn.cursor()
cur.execute("DELETE FROM users WHERE id = %s", (5,))
conn.commit()В 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 используется оператор 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 8.0 тип возвращаемого значения функции pg_delete() был изменен. Ранее функция возвращала ресурс (resource) в случае использования асинхронного режима, теперь возвращается объект PgSql\Result. При обычном выполнении по-прежнему возвращается bool.
В PHP 8.1 были улучшены сообщения об ошибках, теперь они выбрасывают исключения типа Exception в некоторых случаях, хотя функция в основном возвращает false при ошибках.
Параметр connection теперь ожидает объект PgSql\Connection вместо ресурса (resource), но приведение типов обратно совместимо.
Удаление записей, где несколько столбцов соответствуют значениям.
<?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
$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
$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
$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-инъекции.