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

Примеры и особенности работы с pg_fetch_array в PHP
Раздел: Базы данных (PostgreSQL)
pg_fetch_array(PgSql\Result $result, ?int $row = null, int $mode = PGSQL_BOTH): array|false

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

Функция pg_fetch_array используется для получения строки результата запроса к базе данных PostgreSQL в виде массива. Эта функция применяется после выполнения запросов с помощью pg_query или подобных функций для последовательного чтения данных.

Аргументы функции
  • result - обязательный ресурс результата запроса, возвращаемый функцией pg_query.
  • row - необязательный целочисленный параметр, указывающий номер извлекаемой строки. Если не указан, функция возвращает следующую строку.
  • result_type - необязательный параметр, определяющий тип возвращаемого массива. Принимает значения: PGSQL_ASSOC (ассоциативный массив), PGSQL_NUM (индексированный массив), PGSQL_BOTH (оба типа одновременно, используется по умолчанию).

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

Пример с ассоциативным массивом
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($conn, "SELECT id, name FROM users");
while ($row = pg_fetch_array($result, null, PGSQL_ASSOC)) {
    echo $row['id'] . ': ' . $row['name'] . "<br>";
}
pg_close($conn);
?>
Результат
1: Иван Петров
2: Мария Сидорова
3: Алексей Иванов
Пример с индексированным массивом
<?php
$row = pg_fetch_array($result, 0, PGSQL_NUM);
echo $row[0]; // Выведет значение первого столбца
?>

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

Возвращает строку результата только в виде ассоциативного массива. Всегда эквивалентна pg_fetch_array с параметром PGSQL_ASSOC. Удобна для читаемости кода.

Возвращает строку результата только в виде индексированного массива. Аналогична pg_fetch_array с параметром PGSQL_NUM.

Возвращает строку результата в виде объекта. Позволяет обращаться к данным через оператор ->, что удобно в объектно-ориентированном стиле.

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

Python (psycopg2)
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()
cur.execute("SELECT id, name FROM users")
rows = cur.fetchall()  # Возвращает список кортежей
for row in rows:
    print(f"{row[0]}: {row[1]}")  # Доступ по индексу
cur.close()
JavaScript (node-postgres)
const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT id, name FROM users');
// Результат в виде массива объектов
res.rows.forEach(row => {
    console.log(`${row.id}: ${row.name}`); // Доступ по имени поля
});
MySQL (PHP)
// Вместо pg_fetch_array используется mysqli_fetch_array
$result = $mysqli->query("SELECT id, name FROM users");
while ($row = $result->fetch_array(MYSQLI_BOTH)) {
    echo $row['id'] . ': ' . $row[1];
}

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

Использование неправильного типа результата
$row = pg_fetch_array($result, 0, 5); // Неверный тип
var_dump($row);
bool(false)
Чтение после завершения выборки
while ($row = pg_fetch_array($result)) {
    // Обработка
}
$extra_row = pg_fetch_array($result); // false
if (!$extra_row) {
    echo "Данных больше нет";
}
Работа с закрытым соединением
pg_close($conn);
$row = pg_fetch_array($result); // Предупреждение

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

Начиная с PHP 8.1, параметр row может принимать значение null для указания следующей строки, что делает поведение более явным. В PHP 8.0 улучшена обработка ошибок при неверных типах аргументов.

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

Работа с большими наборами данных
Пример php
<?php
// Использование курсора для эффективной обработки
$conn = pg_connect("...");
pg_query($conn, "BEGIN");
pg_query($conn, "DECLARE cur CURSOR FOR SELECT * FROM large_table");

while ($row = pg_fetch_array(pg_query($conn, "FETCH 100 FROM cur"), null, PGSQL_ASSOC)) {
    // Пакетная обработка по 100 строк
    process_batch($row);
}
pg_query($conn, "CLOSE cur");
pg_query($conn, "COMMIT");
?>
Комбинирование типов выборки
Пример php
<?php
$result = pg_query($conn, "SELECT id, name, created_at FROM users");
$first_row = pg_fetch_array($result, 0, PGSQL_BOTH);

// Доступ к данным разными способами
echo $first_row['id'];      // По имени
еcho $first_row[0];         // По индексу
echo $first_row['name'];
echo $first_row[1];
?>
Использование с pg_result_seek
Пример php
<?php
// Возврат к определенной строке
pg_result_seek($result, 2); // Переход к третьей строке
$row = pg_fetch_array($result);
echo "Третья строка: " . $row['name'];
?>
Обработка NULL значений
Пример php
<?php
$row = pg_fetch_array($result);
if ($row['optional_field'] === null) {
    echo "Поле не заполнено";
} else {
    echo htmlspecialchars($row['optional_field']);
}
?>

PHP pg_fetch_array function comments

En
Pg fetch array Fetch a row as an array