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

Использование pg_fetch_result для работы с PostgreSQL в PHP
Раздел: Базы данных (PostgreSQL)
pg_fetch_result(PgSql\Result $result, $field = ?): string|false|null
Основные сведения о pg_fetch_result

Функция pg_fetch_result в PHP предназначена для извлечения значения из результата запроса к базе данных PostgreSQL. Она используется после выполнения запросов функциями pg_query или pg_send_query и получения ресурса результата.

Аргументы функции

Функция поддерживает два варианта синтаксиса:

  1. pg_fetch_result(resource $result, int $row, mixed $field) — извлекает значение из указанной строки и поля.
  2. pg_fetch_result(resource $result, mixed $field) — извлекает значение из текущей строки, на которую указывает внутренний указатель.

Параметры:

  • $result — ресурс результата запроса PostgreSQL, возвращаемый функциями pg_query, pg_send_query или pg_get_result.
  • $row (необязательный) — номер строки для извлечения данных (нумерация с 0). Если не указан, используется текущая строка.
  • $field — имя столбца (строка) или его индекс (целое число). Индексы начинаются с 0.

Функция возвращает значение ячейки в виде строки или NULL в случае ошибки или отсутствия данных.

Простые примеры использования
Извлечение по номеру строки и имени поля
$result = pg_query($conn, "SELECT name, age FROM users WHERE id = 1");
$value = pg_fetch_result($result, 0, 'name');
echo $value;
Иван
Извлечение по номеру строки и индексу поля
$result = pg_query($conn, "SELECT name, age FROM users");
$value = pg_fetch_result($result, 2, 0); // Третья строка, первый столбец
echo $value;
Мария
Извлечение из текущей строки
$result = pg_query($conn, "SELECT name, age FROM users");
pg_fetch_row($result); // Перемещаем указатель на первую строку
$value = pg_fetch_result($result, 'age');
echo $value;
25
Обработка NULL-значений
$result = pg_query($conn, "SELECT name FROM users WHERE id = 999");
$value = pg_fetch_result($result, 0, 'name');
var_dump($value);
bool(false)
Похожие функции в PHP

В PHP для работы с результатами PostgreSQL существует несколько альтернативных функций:

  • pg_fetch_row — извлекает строку как индексированный массив. Удобна для последовательной обработки.
  • pg_fetch_assoc — извлекает строку как ассоциативный массив. Позволяет обращаться к полям по имени.
  • pg_fetch_array — извлекает строку как массив обоих типов (ассоциативный и индексированный). Используется при необходимости гибкого доступа.
  • pg_fetch_object — возвращает объект со свойствами, соответствующими именам столбцов. Предпочтительна в объектно-ориентированном коде.

pg_fetch_result применяется при необходимости получить одно значение из известной позиции. Остальные функции лучше подходят для обработки целых строк или итерации по всему результату.

Аналоги в других языках
Python (библиотека psycopg2)
cur.execute("SELECT name FROM users WHERE id = 1")
value = cur.fetchone()[0]
print(value)
Иван
JavaScript (библиотека node-postgres)
const res = await client.query('SELECT name FROM users WHERE id = 1');
const value = res.rows[0].name;
console.log(value);
Иван
MySQL (PHP PDO)
$stmt = $pdo->query("SELECT name FROM users WHERE id = 1");
$value = $stmt->fetchColumn();
echo $value;
Иван

Отличия: В Python и JavaScript результат обычно получают в виде структур данных (кортежи, объекты), а не через отдельную функцию для одного значения. В PHP PDU аналогом является метод fetchColumn.

Типичные ошибки
Обращение к несуществующей строке
$result = pg_query($conn, "SELECT name FROM users LIMIT 1");
$value = pg_fetch_result($result, 5, 'name'); // Всего 1 строка
echo $value;
bool(false)
Некорректное имя поля
$result = pg_query($conn, "SELECT name FROM users");
$value = pg_fetch_result($result, 0, 'full_name'); // Поле не существует
var_dump($value);
bool(false)
Использование неверного типа параметра
$result = pg_query($conn, "SELECT name FROM users");
$value = pg_fetch_result($result, 'zero', 'name'); // Строка вместо числа
var_dump($value);
bool(false)
Работа с закрытым соединением
$result = pg_query($conn, "SELECT name FROM users");
pg_close($conn);
$value = pg_fetch_result($result, 0, 'name'); // Ресурс уже недействителен
var_dump($value);
Warning: pg_fetch_result(): supplied resource is not a valid PostgreSQL result resource
Изменения в версиях PHP

В PHP 8.0 функция pg_fetch_result претерпела следующие изменения:

  • Параметр $result теперь ожидает объект PgSql\Result вместо ресурса (resource). Это часть общего перехода на объекты для расширений баз данных.
  • При передаче неверного типа аргумента выбрасывается исключение TypeError, а не предупреждение.
  • Функция возвращает null при ошибке, но в строгом режиме может генерировать исключения для некорректных операций.
// PHP 7
$value = pg_fetch_result(false, 0, 'name'); // Warning
// PHP 8
$value = pg_fetch_result(false, 0, 'name'); // TypeError
Расширенные примеры
Получение агрегированных значений
Пример php
$result = pg_query($conn, "SELECT COUNT(*) as cnt, AVG(age) as avg_age FROM users");
$count = pg_fetch_result($result, 0, 'cnt');
$avgAge = pg_fetch_result($result, 0, 'avg_age');
echo "Всего пользователей: $count, средний возраст: $avgAge";
Всего пользователей: 42, средний возраст: 31.5
Итерация по всем строкам одного столбца
Пример php
$result = pg_query($conn, "SELECT id, name FROM users ORDER BY id");
$totalRows = pg_num_rows($result);
for ($i = 0; $i < $totalRows; $i++) {
    $name = pg_fetch_result($result, $i, 'name');
    echo "Пользователь $i: $name\n";
}
Пользователь 0: Иван
Пользователь 1: Мария
Пользователь 2: Петр
Использование с псевдонимами и выражениями
Пример php
$result = pg_query($conn, 
    "SELECT CONCAT(name, ' - ', age) as info, EXTRACT(YEAR FROM created_at) as year FROM users"
);
$info = pg_fetch_result($result, 0, 'info');
$year = pg_fetch_result($result, 0, 'year');
echo "$info (регистрация: $year год)";
Иван - 25 (регистрация: 2023 год)
Обработка бинарных данных
Пример php
$result = pg_query($conn, "SELECT image_data FROM user_images WHERE id = 1");
$binaryData = pg_fetch_result($result, 0, 0);
file_put_contents('image.jpg', $binaryData);
// Файл image.jpg создан
Работа с JSON-полями PostgreSQL
Пример php
$result = pg_query($conn, "SELECT settings->>'theme' as theme FROM users WHERE id = 1");
$theme = pg_fetch_result($result, 0, 'theme');
echo "Тема оформления: $theme";
Тема оформления: dark
Комбинирование с другими функциями
Пример php
$result = pg_query($conn, "SELECT name, age FROM users");
while (pg_fetch_row($result)) {
    $name = pg_fetch_result($result, 'name'); // Без указания строки
    $age = pg_fetch_result($result, 'age');
    echo "$name ($age лет)\n";
}
Иван (25 лет)
Мария (30 лет)
Петр (28 лет)

PHP pg_fetch_result function comments

En
Pg fetch result Returns values from a result instance