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

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

Функция pg_fetch_assoc() извлекает строку результата запроса PostgreSQL в виде ассоциативного массива. Каждый ключ массива соответствует имени столбца в результирующей таблице. Функция применяется при работе с базой данных PostgreSQL через расширение PHP PGSQL.

Использование функции происходит после выполнения запроса, например, с помощью pg_query(). Она последовательно возвращает каждую следующую строку результата, пока не будут выбраны все строки. После этого возвращается false.

Аргументы функции
  • $result (обязательный) — ресурс результата запроса, возвращаемый функциями pg_query(), pg_query_params() или pg_execute().
  • $row (необязательный) — номер строки для выборки. Если аргумент не указан, функция выбирает следующую доступную строку.
  • $result_type — устаревший аргумент, в современных версиях PHP не используется и игнорируется.
Примеры использования pg_fetch_assoc
Пример 1: Базовое использование
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($conn, "SELECT id, name FROM users");

while ($row = pg_fetch_assoc($result)) {
    echo $row['id'] . ": " . $row['name'] . "\n";
}
?>
1: Иван Петров
2: Мария Сидорова
3: Алексей Иванов
Пример 2: Выборка конкретной строки
<?php
$row = pg_fetch_assoc($result, 2); // Выборка третьей строки (нумерация с 0)
echo $row['name'];
?>
Алексей Иванов
Пример 3: Обработка NULL-значений
<?php
$result = pg_query($conn, "SELECT name, bonus FROM users");
while ($row = pg_fetch_assoc($result)) {
    echo $row['name'] . ": " . ($row['bonus'] ?? 'бонус не назначен') . "\n";
}
?>
Иван Петров: 100
Мария Сидорова: бонус не назначен
Алексей Иванов: 50
Похожие функции в PHP

Возвращает строку в виде массива, который может быть ассоциативным, числовым или обоими типами одновременно. Второй аргумент управляет типом массива: PGSQL_ASSOC, PGSQL_NUM или PGSQL_BOTH. pg_fetch_assoc() эквивалентна pg_fetch_array($result, null, PGSQL_ASSOC).

Возвращает строку в виде индексированного числового массива. Используется, когда не требуются имена столбцов.

Возвращает строку в виде объекта. Свойства объекта соответствуют именам столбцов.

Возвращает все строки результата в виде массива ассоциативных массивов. Полезно для небольших наборов данных.

Критерии выбора

pg_fetch_assoc применяется при необходимости работы с именами столбцов. pg_fetch_row подходит для оптимизированной работы с числовыми индексами. pg_fetch_object используется в объектно-ориентированном контексте. pg_fetch_all удобна для немедленного получения всех данных.

Аналоги в других языках и системах
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 = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute("SELECT id, name FROM users")
row = cur.fetchone()
print(row['id'])  # Доступ по имени столбца
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');
console.log(res.rows); // Массив объектов
res.rows.forEach(row => {
    console.log(`${row.id}: ${row.name}`);
});
MySQL (PHP)
// Вместо pg_fetch_assoc() используется mysqli_fetch_assoc()
$result = $mysqli->query("SELECT id, name FROM users");
while ($row = $result->fetch_assoc()) {
    echo $row['id'] . ": " . $row['name'] . "\n";
}
Основные отличия

В Python и JavaScript работа с БД обычно асинхронная, а результаты запроса по умолчанию возвращаются в структурах, аналогичных ассоциативному массиву. В PHP функция pg_fetch_assoc работает итеративно, требуя циклического вызова.

Типичные ошибки
Ошибка 1: Повторное использование результата после полной выборки
<?php
while ($row = pg_fetch_assoc($result)) {
    // обработка
}
// Результат уже исчерпан
$empty_row = pg_fetch_assoc($result); // Вернет false
if ($empty_row === false) {
    echo "Данные закончились";
}
?>
Данные закончились
Ошибка 2: Неправильное имя столбца
<?php
$row = pg_fetch_assoc($result);
echo $row['FirstName']; // Ошибка, если столбец называется first_name
?>
Notice: Undefined index: FirstName
Ошибка 3: Отсутствие проверки на false
<?php
$row = pg_fetch_assoc($result);
echo $row['name']; // Если запрос не вернул строк, $row будет false
?>
Warning: Trying to access array offset on value of type bool
Изменения в последних версиях PHP

В PHP 8.1 параметр $result_type функции pg_fetch_assoc был объявлен устаревшим. Его значение игнорируется, так как функция всегда возвращает ассоциативный массив.

В PHP 8.0 изменилось поведение при передаче нересурсного значения в параметр $result. Теперь это вызывает ошибку TypeError. Ранее это приводило к предупреждению и возврату false.

<?php
// PHP 8.x
$row = pg_fetch_assoc(null); // TypeError
?>
Расширенные примеры
Пример 1: Работа с JOIN и псевдонимами столбцов
Пример php
<?php
$sql = "SELECT u.id, u.name, d.title as department 
        FROM users u 
        JOIN departments d ON u.department_id = d.id";
$result = pg_query($conn, $sql);

while ($row = pg_fetch_assoc($result)) {
    echo $row['id'] . ": " . $row['name'] . " (" . $row['department'] . ")\n";
}
?>
Пример 2: Использование с pg_result_status
Пример php
<?php
$result = pg_query($conn, "SELECT * FROM users");
if (pg_result_status($result) === PGSQL_TUPLES_OK) {
    $total_rows = pg_num_rows($result);
    echo "Найдено строк: " . $total_rows . "\n";
    
    // Получение всех строк сразу в массив
    $all_data = [];
    while ($row = pg_fetch_assoc($result)) {
        $all_data[] = $row;
    }
    print_r($all_data);
}
?>
Пример 3: Обработка больших результатов с использованием курсора
Пример php
<?php
// Использование серверного курсора для экономии памяти
pg_query($conn, "BEGIN");
pg_query($conn, "DECLARE mycursor CURSOR FOR SELECT * FROM large_table");

$chunk_size = 100;
do {
    $result = pg_query($conn, "FETCH $chunk_size FROM mycursor");
    $rows_in_chunk = 0;
    
    while ($row = pg_fetch_assoc($result)) {
        // обработка строки
        $rows_in_chunk++;
    }
    
    echo "Обработано строк: $rows_in_chunk\n";
} while ($rows_in_chunk > 0);

pg_query($conn, "CLOSE mycursor");
pg_query($conn, "COMMIT");
?>
Пример 4: Комбинирование с функциями обработки данных
Пример php
<?php
$result = pg_query($conn, "SELECT name, salary, hire_date FROM employees");
$employees_by_year = [];

while ($row = pg_fetch_assoc($result)) {
    // Преобразование данных при выборке
    $year = date('Y', strtotime($row['hire_date']));
    $row['salary_formatted'] = number_format($row['salary'], 2);
    
    $employees_by_year[$year][] = $row;
}

print_r($employees_by_year);
?>

PHP pg_fetch_assoc function comments

En
Pg fetch assoc Fetch a row as an associative array