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

Использование pg_execute для выполнения запросов в PostgreSQL
Раздел: Базы данных (PostgreSQL)
pg_execute(PgSql\Connection $connection, string $stmtname, array $params): PgSql\Result|false

Основные сведения о функции pg_execute

Функция pg_execute выполняет подготовленный SQL-запрос, созданный функцией pg_prepare, с заданными параметрами. Использование подготовленных запросов повышает безопасность, предотвращая SQL-инъекции, и может улучшить производительность при многократном выполнении схожих запросов.

Аргументы функции
  • connection – ресурс подключения к базе данных PostgreSQL. Если аргумент не указан, используется последнее открытое подключение.
  • stmtname – имя подготовленного запроса. Должно быть уникальным в рамках соединения.
  • params – массив значений параметров для подстановки в запрос. Количество элементов должно соответствовать количеству параметров в подготовленном запросе.

Функция возвращает ресурс результата запроса при успешном выполнении или false в случае ошибки.

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

Простое выполнение подготовленного запроса
$conn = pg_connect('host=localhost dbname=test user=postgres');
$result = pg_prepare($conn, 'my_query', 'SELECT * FROM users WHERE id = $1');
$res = pg_execute($conn, 'my_query', array(5));
while ($row = pg_fetch_assoc($res)) {
    print_r($row);
}
Array
(
    [id] => 5
    [name] => Иванов
    [email] => ivanov@example.com
)
Выполнение с разными параметрами
pg_prepare($conn, 'select_user', 'SELECT name FROM users WHERE age > $1 AND city = $2');
$result1 = pg_execute($conn, 'select_user', array(18, 'Москва'));
$result2 = pg_execute($conn, 'select_user', array(21, 'Санкт-Петербург'));
// Результат зависит от данных в таблице

Альтернативные функции в PHP

Функция pg_query_params позволяет выполнить параметризованный запрос без предварительной подготовки. Подходит для однократного выполнения запросов.

pg_send_prepare и pg_get_result

Асинхронные функции для подготовки и выполнения запросов. Полезны при необходимости неблокирующего выполнения.

PDO::prepare и PDOStatement::execute

Объектно-ориентированный подход через расширение PDO. Обеспечивает единый интерфейс для работы с разными СУБД.

Аналоги в других языках и системах

Python (psycopg2)
import psycopg2
conn = psycopg2.connect('dbname=test user=postgres')
cur = conn.cursor()
cur.execute('PREPARE myplan AS SELECT * FROM users WHERE id = $1')
cur.execute('EXECUTE myplan', (5,))
JavaScript (node-postgres)
const { Client } = require('pg');
const client = new Client();
await client.connect();
await client.query('PREPARE myplan AS SELECT * FROM users WHERE id = $1');
const res = await client.query('EXECUTE myplan', [5]);
MySQL (PREPARE и EXECUTE)
PREPARE my_stmt FROM 'SELECT * FROM users WHERE id = ?';
SET @id = 5;
EXECUTE my_stmt USING @id;
DEALLOCATE PREPARE my_stmt;

Типичные ошибки при использовании

Несоответствие количества параметров
pg_prepare($conn, 'query', 'SELECT * FROM users WHERE id = $1 AND status = $2');
$result = pg_execute($conn, 'query', array(5)); // Ошибка
Warning: pg_execute(): Query failed: ERROR:  wrong number of parameters
Использование несуществующего подготовленного запроса
$result = pg_execute($conn, 'non_existent_query', array(1));
Warning: pg_execute(): Query failed: ERROR:  prepared statement "non_existent_query" does not exist
Некорректный тип параметров
pg_prepare($conn, 'query', 'INSERT INTO logs (message) VALUES ($1)');
$result = pg_execute($conn, 'query', array(new stdClass())); // Объект вместо строки
Warning: pg_execute(): Query failed: ERROR:  invalid input syntax for type text

Изменения в последних версиях PHP

В PHP 8.1 улучшена обработка ошибок для функций PostgreSQL. Некоторые предупреждения теперь выбрасывают исключения типа Exception. Функция pg_execute продолжает работать стабильно, но рекомендуется использовать объектно-ориентированный стиль с PDO для новых проектов.

Расширенные примеры использования

Транзакции с подготовленными запросами
Пример php
pg_query($conn, 'BEGIN');
try {
    pg_prepare($conn, 'update_balance', 'UPDATE accounts SET balance = balance + $1 WHERE user_id = $2');
    pg_execute($conn, 'update_balance', array(100, 1));
    pg_execute($conn, 'update_balance', array(-100, 2));
    pg_query($conn, 'COMMIT');
} catch (Exception $e) {
    pg_query($conn, 'ROLLBACK');
}
Динамическое построение запроса с переменным числом параметров
Пример php
$ids = [1, 2, 3, 4, 5];
$placeholders = implode(',', array_fill(0, count($ids), '$%d'));
$query = sprintf('SELECT * FROM users WHERE id IN (%s)', $placeholders);
pg_prepare($conn, 'dynamic_query', $query);
$result = pg_execute($conn, 'dynamic_query', $ids);
Использование со сложными типами данных
Пример php
pg_prepare($conn, 'insert_json', 'INSERT INTO config (data) VALUES ($1::jsonb)');
$json_data = json_encode(['theme' => 'dark', 'notifications' => true]);
pg_execute($conn, 'insert_json', array($json_data));
Запись успешно добавлена
Получение метаинформации о результате
Пример php
$result = pg_execute($conn, 'my_query', array(5));
$num_rows = pg_num_rows($result);
$num_fields = pg_num_fields($result);
$field_name = pg_field_name($result, 0);

PHP pg_execute function comments

En
Pg execute Executes a previously prepared statement