Pg execute: примеры (PHP)
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 позволяет выполнить параметризованный запрос без предварительной подготовки. Подходит для однократного выполнения запросов.
Асинхронные функции для подготовки и выполнения запросов. Полезны при необходимости неблокирующего выполнения.
Объектно-ориентированный подход через расширение PDO. Обеспечивает единый интерфейс для работы с разными СУБД.
Аналоги в других языках и системах
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,))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]);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 для новых проектов.
Расширенные примеры использования
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');
}$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);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));Запись успешно добавлена
$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);