Pg get result: примеры (PHP)

Использование pg_get_result для работы с PostgreSQL
Раздел: Базы данных (PostgreSQL)
pg_get_result(PgSql\Connection $connection): PgSql\Result|false
Основы функции pg_get_result

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

Аргументы функции
  • connection (обязательный) - ресурс подключения к PostgreSQL, полученный с помощью pg_connect() или pg_pconnect()
  • result_type (необязательный) - определяет формат возвращаемых данных. Может принимать значения PGSQL_ASSOC, PGSQL_NUM или PGSQL_BOTH (по умолчанию)

Функция возвращает ресурс результата запроса или false, если больше нет ожидающих результатов.

Базовые примеры использования
Пример 1: Получение одного результата
<?
$conn = pg_connect('dbname=test');
pg_send_query($conn, 'SELECT * FROM users');
$result = pg_get_result($conn);
while ($row = pg_fetch_assoc($result)) {
    print_r($row);
}
?>
Array
(
    [id] => 1
    [name] => Иван
    [email] => ivan@example.com
)
Пример 2: Множественные асинхронные запросы
<?
pg_send_query($conn, 'SELECT * FROM users');
pg_send_query($conn, 'SELECT COUNT(*) FROM users');

$result1 = pg_get_result($conn);
$result2 = pg_get_result($conn);
?>
// Результаты обрабатываются последовательно
Альтернативные функции в PHP

Синхронная функция для выполнения SQL-запросов. Блокирует выполнение скрипта до получения результата от базы данных.

Отправляет параметризованный запрос асинхронно. Защищает от SQL-инъекций, рекомендуется для данных от пользователей.

Синхронная версия параметризованного запроса. Обеспечивает безопасность и простоту использования.

Выбор функции зависит от требований: асинхронные запросы через pg_send_query/pg_get_result подходят для оптимизации работы с несколькими запросами, тогда как синхронные варианты проще в реализации.

Аналоги в других языках
Python (psycopg2)
import psycopg2
conn = psycopg2.connect('dbname=test')
cursor = conn.cursor()
cursor.execute('SELECT * FROM users')
result = cursor.fetchall()
JavaScript (node-postgres)
const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT * FROM users');
MySQL в PHP
<?
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
$result = $mysqli->query('SELECT * FROM users');
?>

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

Типичные ошибки
Ошибка 1: Использование неверного соединения
<?
$result = pg_get_result('not_a_connection');
var_dump($result);
?>
bool(false)
Ошибка 2: Попытка получить результат без отправки запроса
<?
$conn = pg_connect('dbname=test');
$result = pg_get_result($conn); // Не было отправленных запросов
var_dump($result);
?>
bool(false)
Ошибка 3: Неполучение всех результатов
<?
pg_send_query($conn, 'SELECT 1; SELECT 2; SELECT 3');
$result1 = pg_get_result($conn); // Только первый результат
// Остальные результаты остаются в памяти
?>

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

Изменения в версиях PHP

В PHP 8.1 улучшена обработка ошибок при работе с недействительными соединениями. Функция теперь более строго проверяет тип передаваемого аргумента connection.

Начиная с PHP 8.0, многие устаревшие параметры и флаги были удалены, но pg get result сохранила обратную совместимость. Рекомендуется использовать актуальные методы асинхронной работы с расширением pgsql.

В PHP 7.4 была улучшена производительность при работе с большим количеством асинхронных запросов.

Расширенные примеры
Пример 1: Параллельная обработка нескольких запросов
Пример php
<?
$conn = pg_connect('host=localhost dbname=test');

// Отправка нескольких запросов
pg_send_query($conn, 'SELECT * FROM users WHERE active = true');
pg_send_query($conn, 'SELECT * FROM orders WHERE status = \'pending\'');
pg_send_query($conn, 'SELECT COUNT(*) FROM logs');

// Обработка результатов по мере готовности
$results = [];
while ($result = pg_get_result($conn)) {
    $results[] = pg_fetch_all($result);
}

print_r($results);
?>
Пример 2: Комбинирование с pg_connection_busy
Пример php
<?
pg_send_query($conn, 'SELECT expensive_calculation()');

// Выполнение другого кода во время расчета
while (pg_connection_busy($conn)) {
    usleep(10000); // Небольшая пауза
    // Параллельные операции
}

$result = pg_get_result($conn);
?>
Пример 3: Многозапросная операция
Пример php
<?
pg_send_query($conn, 'INSERT INTO logs(message) VALUES (\'test\'); SELECT lastval();');
$insertResult = pg_get_result($conn);
$idResult = pg_get_result($conn); // Второй результат
$id = pg_fetch_result($idResult, 0, 0);
echo 'Новая запись с ID: ' . $id;
?>
Пример 4: Обработка с использованием PGSQL_NUM
Пример php
<?
pg_send_query($conn, 'SELECT id, name FROM products');
$result = pg_get_result($conn);

while ($row = pg_fetch_array($result, null, PGSQL_NUM)) {
    echo 'ID: ' . $row[0] . ', Name: ' . $row[1];
}
?>

PHP pg_get_result function comments

En
Pg get result Get result of an asynchronous query