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

Функция pg_fetch_row в PHP: примеры и особенности
Раздел: Базы данных (PostgreSQL)
pg_fetch_row(PgSql\Result $result, ?int $row = null, int $mode = PGSQL_NUM): array|false

Описание функции pg_fetch_row

Функция pg_fetch_row используется в PHP для извлечения строки результата запроса из базы данных PostgreSQL в виде индексированного массива. Каждый элемент массива соответствует значению столбца. Нумерация индексов начинается с 0.

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

Функция принимает три аргумента:

  1. $result (обязательный): Ресурс результата запроса, возвращаемый функциями pg_query, pg_send_query и другими.
  2. $row (необязательный): Номер извлекаемой строки. Если не указан, функция выбирает следующую доступную строку. Если передано null, также выбирает следующую строку.
  3. $result_type (необязательный): Влияет на тип возвращаемого значения. Доступны константы: PGSQL_NUM (по умолчанию, возвращает массив с числовыми индексами), PGSQL_ASSOC (возвращает ассоциативный массив, но для этого лучше использовать pg_fetch_assoc) и PGSQL_BOTH (возвращает массив с числовыми и строковыми индексами). Для pg_fetch_row этот параметр часто игнорируется, так как функция всегда возвращает числовой массив.

Короткие примеры использования

Пример 1: Базовое использование
<?
$connection = pg_connect('host=localhost dbname=test user=postgres');
$result = pg_query($connection, 'SELECT id, name FROM users LIMIT 2');
echo 'Строка 0:\n';
print_r(pg_fetch_row($result)); // Получить первую строку
echo '\nСтрока 1:\n';
print_r(pg_fetch_row($result)); // Получить вторую строку
?>
Строка 0:
Array
(
    [0] => 1
    [1] => Иван
)
Строка 1:
Array
(
    [0] => 2
    [1] => Мария
)
Пример 2: Использование с параметром $row
<?
// ... соединение и запрос, как в примере 1
$second_row = pg_fetch_row($result, 1); // Получить строку с индексом 1 (вторая строка)
print_r($second_row);
?>
Array
(
    [0] => 2
    [1] => Мария
)
Пример 3: Чтение всех строк в цикле
<?
while ($row = pg_fetch_row($result)) {
    echo 'ID: ' . $row[0] . ', Имя: ' . $row[1] . "\n";
}
?>
ID: 1, Имя: Иван
ID: 2, Имя: Мария

Похожие функции в PHP

  • pg_fetch_assoc: Возвращает строку как ассоциативный массив, где ключи - имена столбцов. Удобнее для читаемости кода, когда нужен доступ по имени поля.
  • pg_fetch_array: Возвращает массив, который по умолчанию содержит и числовые, и строковые индексы. Менее эффективен, чем специализированные функции, если нужен только один тип индексации.
  • pg_fetch_object: Возвращает строку как объект. Свойства объекта соответствуют именам столбцов. Предпочтителен в объектно-ориентированном стиле.
  • pg_fetch_all: Возвращает массив, содержащий все строки результата. Полезен для небольших наборов данных, которые нужно обработать в памяти.

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

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

Python (psycopg2)
import psycopg2
conn = psycopg2.connect('host=localhost dbname=test user=postgres')
cur = conn.cursor()
cur.execute('SELECT id, name FROM users LIMIT 2')
row = cur.fetchone()  # Получение одной строки как кортежа
print(row)  # (1, 'Иван')
rows = cur.fetchall()  # Получение всех строк как список кортежей
print(rows)  # [(1, 'Иван'), (2, 'Мария')]
(1, 'Иван')
[(1, 'Иван'), (2, 'Мария')]
JavaScript (Node.js, библиотека 'pg')
const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT id, name FROM users LIMIT 2');
console.log(res.rows[0]); // { id: 1, name: 'Иван' } - объект
console.log(res.rows[1].name); // 'Мария' - доступ по имени поля
{ id: 1, name: 'Иван' }
Мария
MySQLi (PHP)
<?
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$result = $mysqli->query('SELECT id, name FROM users');
$row = $result->fetch_row(); // Аналог pg_fetch_row
print_r($row);
?>
Array
(
    [0] => 1
    [1] => Иван
)

Ключевое отличие: в Python и JavaScript по умолчанию возвращаются структуры (кортеж/объект), близкие к ассоциативному массиву в PHP, а не индексный массив.

Типичные ошибки

Ошибка 1: Обращение к индексу несуществующего столбца
<?
$result = pg_query($conn, 'SELECT name FROM users WHERE id=1');
$row = pg_fetch_row($result);
echo $row[1]; // Столбец с индексом 1 не существует, есть только $row[0]
?>
Notice: Undefined offset: 1 in ...
(пустой вывод или предупреждение)
Ошибка 2: Повторный вызов после исчерпания результата
<?
$result = pg_query($conn, 'SELECT id FROM users WHERE id=1');
$row1 = pg_fetch_row($result); // OK
$row2 = pg_fetch_row($result); // FALSE, так как строк больше нет
var_dump($row2);
?>
bool(false)
Ошибка 3: Использование неверного ресурса
<?
$conn = pg_connect('...');
$wrong_result = 'not a resource';
$row = pg_fetch_row($wrong_result); // Предупреждение
?>
Warning: pg_fetch_row() expects parameter 1 to be resource, string given in ...

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

В PHP 8.1 функция pg_fetch_row теперь возвращает null, если строка не найдена, или если произошла ошибка, в отличие от предыдущих версий, где возвращалось false. Это изменение связано с переходом к более строгой типизации.

<?
// PHP 8.1+
$result = pg_query($conn, 'SELECT * FROM users WHERE 1=0'); // Нет строк
$row = pg_fetch_row($result);
var_dump($row);
?>
NULL

Рекомендуется проверять результат на null, а не на false в новых версиях.

Расширенные примеры

Пример 1: Использование с pg_fetch_result для получения конкретного значения
Пример php
<?
$result = pg_query($conn, 'SELECT COUNT(*) FROM users');
$countArray = pg_fetch_row($result);
echo 'Количество пользователей: ' . $countArray[0];
// Альтернатива
pg_result_seek($result, 0); // Сброс указателя на первую строку
$count = pg_fetch_result($result, 0, 0); // Прямое получение значения
?>
Количество пользователей: 42
Пример 2: Обработка большого набора данных с экономией памяти
Пример php
<?
$result = pg_query($conn, 'SELECT id, large_text_field FROM huge_table');
$outputFile = fopen('output.csv', 'w');
while ($row = pg_fetch_row($result)) {
    fputcsv($outputFile, $row); // Запись каждой строки в CSV
}
fclose($outputFile);
pg_free_result($result); // Явное освобождение памяти
?>
Пример 3: Комбинирование с list() для удобного присваивания
Пример php
<?
$result = pg_query($conn, 'SELECT id, name, email FROM users WHERE id=1');
list($id, $name, $email) = pg_fetch_row($result);
echo "$id: $name <$email>";
?>
1: Иван 
Пример 4: Работа с параметром $result_type (PGSQL_BOTH)
Пример php
<?
$result = pg_query($conn, 'SELECT id, name FROM users WHERE id=1');
$row = pg_fetch_row($result, null, PGSQL_BOTH); // Теперь доступны и числовые, и строковые ключи
echo $row[0] . ' ' . $row['id']; // Оба варианта работают
?>
1 1
Пример 5: Итерация с использованием pg_result_seek
Пример php
<?
$result = pg_query($conn, 'SELECT name FROM users ORDER BY id');
$totalRows = pg_num_rows($result);
for ($i = $totalRows - 1; $i >= 0; $i--) {
    pg_result_seek($result, $i); // Перемещение указателя на строку $i
    $row = pg_fetch_row($result);
    echo $row[0] . "\n"; // Вывод в обратном порядке
}
?>

PHP pg_fetch_row function comments

En
Pg fetch row Fetch a row as an enumerated array