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

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

Функция pg_update в PHP предназначена для обновления записей в таблице базы данных PostgreSQL. Она является частью модуля PostgreSQL (pgsql) и предоставляет удобный интерфейс для выполнения операций UPDATE.

Область применения

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

Аргументы функции

Функция принимает следующие параметры:

  • connection - ресурс подключения к PostgreSQL.
  • table_name - имя таблицы для обновления.
  • data - ассоциативный массив, где ключи - имена столбцов, а значения - новые данные.
  • condition - ассоциативный массив условий WHERE для выбора обновляемых строк.
  • options - необязательный флаг, определяющий поведение функции. Может быть PGSQL_DML_EXEC, PGSQL_DML_STRING или их комбинацией с PGSQL_DML_ESCAPE.
Базовый пример обновления

Обновление записи с определенным идентификатором:

$conn = pg_connect("host=localhost dbname=test user=postgres");
$data = ['name' => 'Иван', 'age' => 30];
$condition = ['id' => 5];
$result = pg_update($conn, 'users', $data, $condition);
if ($result) {
    echo "Запись обновлена";
}
Запись обновлена
С возвратом SQL-строки

Получение SQL-запроса вместо выполнения:

$data = ['status' => 'active'];
$condition = ['user_id' => 100];
$sql = pg_update($conn, 'accounts', $data, $condition, PGSQL_DML_STRING);
echo $sql;
UPDATE accounts SET status='active' WHERE user_id=100;
Альтернативные функции в PHP

pg_query + pg_escape_string - позволяет выполнять произвольные SQL-запросы. Предпочтительнее для сложных обновлений с JOIN или подзапросами.

PDO::exec или PDO::prepare - часть PDO расширения. Обеспечивает лучшую переносимость между СУБД и защиту от SQL-инъекций через подготовленные выражения.

pg_send_query - асинхронная версия, позволяющая не блокировать выполнение скрипта.

Аналоги в других языках
Python (psycopg2)
cur.execute("""
    UPDATE users 
    SET name = %s, age = %s 
    WHERE id = %s
""", ('Иван', 30, 5))
JavaScript (Node.js, pg library)
await client.query(
    'UPDATE users SET name=$1, age=$2 WHERE id=$3',
    ['Иван', 30, 5]
);

Pg update в MySQL

UPDATE users 
SET name='Иван', age=30 
WHERE id=5;

Основное отличие PHP функции - использование ассоциативных массивов для данных и условий, в то время как другие языки часто используют параметризованные запросы.

Типичные ошибки
Неверные имена столбцов
$data = ['user_name' => 'John']; // Столбец 'username' не существует
$condition = ['id' => 1];
$result = pg_update($conn, 'users', $data, $condition);
if (!$result) {
    echo pg_last_error($conn);
}
ERROR: column "user_name" of relation "users" does not exist
Отсутствие условий WHERE
// Опасный запрос - обновит все строки
$data = ['status' => 'inactive'];
$result = pg_update($conn, 'users', $data, []);
echo "Обновлено строк: " . $result;
Обновлено строк: 1500
Проблемы с типами данных
$data = ['price' => 'сто'];
$condition = ['id' => 10];
$result = pg_update($conn, 'products', $data, $condition);
ERROR: invalid input syntax for type integer: "сто"
Изменения в версиях PHP

В PHP 8.0 были внесены следующие изменения:

  • Функция теперь выбрасывает исключение ValueError при передаче неверных параметров, вместо генерации предупреждений.
  • Улучшена обработка нулевых значений в массивах данных и условий.
  • Изменено поведение флага PGSQL_DML_ESCAPE в сочетании с другими флагами.
Расширенные примеры
Обновление с использованием PGSQL_DML_ESCAPE
Пример php
$data = ['description' => "O'Reilly books"];
$condition = ['id' => 15];
$result = pg_update($conn, 'books', $data, $condition, 
    PGSQL_DML_EXEC | PGSQL_DML_ESCAPE);
Пакетное обновление через цикл
Пример php
$updates = [
    ['data' => ['status' => 'processed'], 'cond' => ['id' => 1]],
    ['data' => ['status' => 'pending'], 'cond' => ['id' => 2]]
];
foreach ($updates as $update) {
    pg_update($conn, 'orders', $update['data'], $update['cond']);
}
Обновление с возвратом измененных строк
Пример php
// Требуется PostgreSQL 9.5+
$sql = "UPDATE products SET stock = stock - 1 
        WHERE id = 10 AND stock > 0 
        RETURNING *";
$result = pg_query($conn, $sql);
$row = pg_fetch_assoc($result);
Использование с JSONB полями
Пример php
$data = ['metadata' => '{"tags": ["php", "postgres"]}'];
$condition = ['id' => 7];
pg_update($conn, 'articles', $data, $condition);

PHP pg_update function comments

En
Pg update Update table