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

Функция pg_fetch_all для выборки данных из PostgreSQL
Раздел: Базы данных (PostgreSQL)
pg_fetch_all(PgSql\Result $result, int $mode = PGSQL_ASSOC): array
Описание функции pg_fetch_all

Функция pg_fetch_all извлекает все строки из результата запроса PostgreSQL в виде массива. Эта функция применяется после выполнения запроса функциями pg_query или pg_send_query/pg_get_result для получения полного набора данных.

Аргументы функции
  • result (обязательный): Ресурс результата запроса PostgreSQL, возвращаемый функциями pg_query, pg_send_query и pg_get_result.
  • mode (необязательный, доступен с PHP 8.1): Константа, определяющая тип возвращаемого массива:
    • PGSQL_ASSOC (по умолчанию) — возвращает ассоциативный массив.
    • PGSQL_NUM — возвращает индексированный массив.
    • PGSQL_BOTH — возвращает массив, индексированный как числами, так и именами столбцов.

Функция возвращает массив массивов или false, если строк нет или произошла ошибка.

Примеры использования
Пример 1: Получение всех строк в ассоциативном массиве
<?
$pdo = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($pdo, "SELECT id, name FROM products");
$allRows = pg_fetch_all($result);
print_r($allRows);
?>
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Клавиатура
        )
    [1] => Array
        (
            [id] => 2
            [name] => Монитор
        )
)
Пример 2: Использование режима PGSQL_NUM
<?
$result = pg_query($pdo, "SELECT id, name FROM products");
$allRows = pg_fetch_all($result, PGSQL_NUM);
print_r($allRows);
?>
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => Клавиатура
        )
    [1] => Array
        (
            [0] => 2
            [1] => Монитор
        )
)
Похожие функции в PHP
  • pg_fetch_assoc: Извлекает одну строку как ассоциативный массив. Применяется для пошаговой обработки больших результатов или при необходимости получить только одну запись.
  • pg_fetch_row: Извлекает одну строку как индексированный массив. Подходит, когда не требуются имена столбцов.
  • pg_fetch_array: Извлекает строку как массив в одном из трех форматов (ASSOC, NUM, BOTH). Универсальная, но менее производительная, чем специализированные.
  • pg_fetch_object: Извлекает строку как объект. Удобно для работы в объектном стиле.

Функцию pg_fetch_all предпочтительнее использовать, когда нужны все строки результата сразу, а объем данных не слишком велик. Для больших наборов данных лучше применять pg_fetch_assoc или pg_fetch_row в цикле, чтобы снизить потребление памяти.

Аналоги в других языках
Python (psycopg2)
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()
cur.execute("SELECT id, name FROM products")
rows = cur.fetchall()  # Возвращает список кортежей
print(rows)
[(1, 'Клавиатура'), (2, 'Монитор')]

В Python fetchall() возвращает список кортежей, а не список словарей. Для получения ассоциативного массива используется DictCursor.

JavaScript (Node.js, библиотека pg)
const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT id, name FROM products');
console.log(res.rows); // Массив объектов
[ { id: 1, name: 'Клавиатура' }, { id: 2, name: 'Монитор' } ]

В Node.js драйвер pg по умолчанию возвращает массив объектов, что аналогично pg_fetch_all с PGSQL_ASSOC.

MySQLi (PHP)
$mysqli = new mysqli("localhost", "user", "pass", "test");
$result = $mysqli->query("SELECT id, name FROM products");
$allRows = $result->fetch_all(MYSQLI_ASSOC); // Появилась в PHP 5.3
print_r($allRows);

Функция fetch_all() в MySQLi аналогична pg_fetch_all, но доступна только при использовании mysqlnd драйвера.

Типичные ошибки
Ошибка 1: Передача неверного ресурса
<?
$result = false;
$data = pg_fetch_all($result); // Предупреждение
?>
Warning: pg_fetch_all() expects parameter 1 to be resource, bool given

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

Ошибка 2: Неправильный режим выборки
<?
$result = pg_query($pdo, "SELECT id, name FROM products");
$data = pg_fetch_all($result, 999); // Несуществующая константа
?>

При неверном значении режима используется значение по умолчанию PGSQL_ASSOC.

Ошибка 3: Использование с пустым результатом
<?
$result = pg_query($pdo, "SELECT * FROM products WHERE 1=0");
$data = pg_fetch_all($result);
var_dump($data);
?>
bool(false)

При отсутствии строк функция возвращает false, а не пустой массив. Это нужно учитывать при дальнейшей обработке.

Изменения в версиях PHP
  • PHP 8.1: Добавлен необязательный аргумент $mode, позволяющий выбирать тип возвращаемого массива. До этой версии функция всегда возвращала ассоциативный массив.
  • PHP 8.0: Изменен тип возвращаемого значения. Теперь функция возвращает array|false. Ранее возвращался array, что могло вводить в заблуждение при пустом результате.
Расширенные примеры
Пример с обработкой больших данных

Не рекомендуется использовать pg_fetch_all для очень больших результатов. Лучше применять цикл.

Пример php
<?
$result = pg_query($pdo, "SELECT * FROM huge_table");
while ($row = pg_fetch_assoc($result)) {
    // Обработка каждой строки по отдельности
    processRow($row);
}
?>
Пример преобразования данных
Пример php
<?
$result = pg_query($pdo, "SELECT id, name, price FROM products");
$allProducts = pg_fetch_all($result);

// Преобразование в массив вида id => name
$idNameMap = array_column($allProducts, 'name', 'id');
print_r($idNameMap);

// Подсчет средней цены
$totalPrice = array_sum(array_column($allProducts, 'price'));
$avgPrice = $totalPrice / count($allProducts);
?>
Пример использования с PGSQL_BOTH
Пример php
<?
$result = pg_query($pdo, "SELECT id, name FROM products LIMIT 1");
$row = pg_fetch_all($result, PGSQL_BOTH);
print_r($row);
?>
Array
(
    [0] => Array
        (
            [id] => 1
            [0] => 1
            [name] => Клавиатура
            [1] => Клавиатура
        )
)

Режим PGSQL_BOTH создает избыточные данные, поэтому используется редко.

Пример работы с JSON полями PostgreSQL
Пример php
<?
$result = pg_query($pdo, "SELECT id, attributes::json FROM products");
$all = pg_fetch_all($result);
// Предположим, что attributes содержит JSON
foreach ($all as $product) {
    $attrs = json_decode($product['attributes'], true);
    echo $product['id'] . ': ' . $attrs['color'] . "\n";
}
?>

PHP pg_fetch_all function comments

En
Pg fetch all Fetches all rows from a result as an array