Pg update: примеры (PHP)
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-запроса вместо выполнения:
$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;
pg_query + pg_escape_string - позволяет выполнять произвольные SQL-запросы. Предпочтительнее для сложных обновлений с JOIN или подзапросами.
PDO::exec или PDO::prepare - часть PDO расширения. Обеспечивает лучшую переносимость между СУБД и защиту от SQL-инъекций через подготовленные выражения.
pg_send_query - асинхронная версия, позволяющая не блокировать выполнение скрипта.
cur.execute("""
UPDATE users
SET name = %s, age = %s
WHERE id = %s
""", ('Иван', 30, 5))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
// Опасный запрос - обновит все строки
$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 8.0 были внесены следующие изменения:
- Функция теперь выбрасывает исключение
ValueErrorпри передаче неверных параметров, вместо генерации предупреждений. - Улучшена обработка нулевых значений в массивах данных и условий.
- Изменено поведение флага
PGSQL_DML_ESCAPEв сочетании с другими флагами.
$data = ['description' => "O'Reilly books"];
$condition = ['id' => 15];
$result = pg_update($conn, 'books', $data, $condition,
PGSQL_DML_EXEC | PGSQL_DML_ESCAPE);$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']);
}// Требуется 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);$data = ['metadata' => '{"tags": ["php", "postgres"]}'];
$condition = ['id' => 7];
pg_update($conn, 'articles', $data, $condition);