Pg get result: примеры (PHP)
pg_get_result(PgSql\Connection $connection): PgSql\Result|falseФункция pg_get_result в PHP предназначена для получения результата асинхронного запроса к базе данных PostgreSQL. Она используется при работе в неблокирующем режиме, когда несколько запросов отправляются последовательно без ожидания ответа на каждый из них.
- connection (обязательный) - ресурс подключения к PostgreSQL, полученный с помощью pg_connect() или pg_pconnect()
- result_type (необязательный) - определяет формат возвращаемых данных. Может принимать значения PGSQL_ASSOC, PGSQL_NUM или PGSQL_BOTH (по умолчанию)
Функция возвращает ресурс результата запроса или false, если больше нет ожидающих результатов.
<?
$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
)<?
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);
?>// Результаты обрабатываются последовательно
Синхронная функция для выполнения SQL-запросов. Блокирует выполнение скрипта до получения результата от базы данных.
Отправляет параметризованный запрос асинхронно. Защищает от SQL-инъекций, рекомендуется для данных от пользователей.
Синхронная версия параметризованного запроса. Обеспечивает безопасность и простоту использования.
Выбор функции зависит от требований: асинхронные запросы через pg_send_query/pg_get_result подходят для оптимизации работы с несколькими запросами, тогда как синхронные варианты проще в реализации.
import psycopg2
conn = psycopg2.connect('dbname=test')
cursor = conn.cursor()
cursor.execute('SELECT * FROM users')
result = cursor.fetchall()const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT * FROM users');<?
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
$result = $mysqli->query('SELECT * FROM users');
?>Основное отличие PHP-функции pg_get_result — поддержка асинхронных операций, тогда как многие аналоги работают только синхронно или требуют других подходов для асинхронности.
<?
$result = pg_get_result('not_a_connection');
var_dump($result);
?>bool(false)
<?
$conn = pg_connect('dbname=test');
$result = pg_get_result($conn); // Не было отправленных запросов
var_dump($result);
?>bool(false)
<?
pg_send_query($conn, 'SELECT 1; SELECT 2; SELECT 3');
$result1 = pg_get_result($conn); // Только первый результат
// Остальные результаты остаются в памяти
?>Для избежания утечек памяти необходимо получать все результаты многозапросной операции.
В PHP 8.1 улучшена обработка ошибок при работе с недействительными соединениями. Функция теперь более строго проверяет тип передаваемого аргумента connection.
Начиная с PHP 8.0, многие устаревшие параметры и флаги были удалены, но pg get result сохранила обратную совместимость. Рекомендуется использовать актуальные методы асинхронной работы с расширением pgsql.
В PHP 7.4 была улучшена производительность при работе с большим количеством асинхронных запросов.
<?
$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);
?><?
pg_send_query($conn, 'SELECT expensive_calculation()');
// Выполнение другого кода во время расчета
while (pg_connection_busy($conn)) {
usleep(10000); // Небольшая пауза
// Параллельные операции
}
$result = pg_get_result($conn);
?><?
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;
?><?
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];
}
?>