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

Полное руководство по функции pg_fetch_all_columns в PHP
Раздел: Базы данных (PostgreSQL)
pg_fetch_all_columns(PgSql\Result $result, int $field = 0): array
Описание функции pg_fetch_all_columns

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

Синтаксис и аргументы

Синтаксис функции: pg_fetch_all_columns(resource $result, int $column = 0): array.

  • $result: Обязательный параметр. Ресурс результата запроса, возвращаемый функциями pg_query(), pg_query_params() или pg_execute().
  • $column: Необязательный параметр. Номер столбца, данные которого требуется извлечь. Нумерация начинается с 0. Значение по умолчанию - 0 (первый столбец).

Функция возвращает массив (array), содержащий все значения указанного столбца для каждой строки результата. Если строк нет, возвращается пустой массив.

Базовые примеры использования
Пример 1: Получение всех значений первого столбца
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($conn, "SELECT id FROM users ORDER BY id LIMIT 3");
$ids = pg_fetch_all_columns($result);
print_r($ids);
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Пример 2: Указание номера столбца
$result = pg_query($conn, "SELECT id, name, email FROM users LIMIT 2");
$emails = pg_fetch_all_columns($result, 2); // Получаем третий столбец (email)
print_r($emails);
Array
(
    [0] => user1@example.com
    [1] => user2@example.com
)
Пример 3: Пустой результат запроса
$result = pg_query($conn, "SELECT name FROM users WHERE 1=0");
$names = pg_fetch_all_columns($result);
var_dump($names);
array(0) {
}
Похожие функции в PHP
  • pg_fetch_all(): Извлекает все строки результата в виде массива ассоциативных массивов или массивов с числовыми индексами. Удобна для получения полного набора данных всех столбцов.
  • pg_fetch_assoc() / pg_fetch_row(): Извлекают одну строку за вызов. Применяются для итеративной обработки больших результатов, чтобы не загружать все данные в память сразу.
  • pg_fetch_result(): Получает значение из конкретной строки и столбца. Используется для точечного доступа к данным.

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

Аналоги в других языках и СУБД
Python (psycopg2)
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()
cur.execute("SELECT name FROM users")
# Извлечение всех значений одного столбца через list comprehension
names = [row[0] for row in cur.fetchall()]
print(names)
['Alice', 'Bob', 'Charlie']
JavaScript (Node.js, pg library)
const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT email FROM users');
// map для преобразования строк в значения столбца
const emails = res.rows.map(row => row.email);
console.log(emails);
MySQL (SQL запрос)

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

-- Сам запрос может сразу возвращать плоский список через GROUP_CONCAT, но это не всегда практично
SELECT GROUP_CONCAT(name SEPARATOR ', ') FROM users;
Типичные ошибки
Ошибка 1: Неверный номер столбца
$result = pg_query($conn, "SELECT id FROM users");
$data = pg_fetch_all_columns($result, 5); // Столбца с индексом 5 не существует
// Функция вернет пустой массив для несуществующего столбца
var_dump($data);
array(0) {
}
Ошибка 2: Передача неверного ресурса
$fake_result = null;
$data = pg_fetch_all_columns($fake_result);
// Вызовет предупреждение и вернет false
Warning: pg_fetch_all_columns() expects parameter 1 to be resource, null given
Ошибка 3: Игнорирование типа данных
// PostgreSQL возвращает BIGINT, PHP может преобразовать его в строку
$result = pg_query($conn, "SELECT bigint_column FROM table");
$values = pg_fetch_all_columns($result);
// Значения могут быть строками, а не целыми числами
Изменения в версиях PHP

Функция pg_fetch_all_columns была добавлена в PHP 5.1.0. С тех пор ее поведение и сигнатура оставались стабильными. В PHP 8.0 усилилась строгая типизация, поэтому передача некорректного типа в параметр $result вызывает TypeError, а не предупреждение, если включен строгий режим.

Расширенные примеры
Пример 1: Использование с pg_query_params
Пример php
$result = pg_query_params(
    $conn,
    "SELECT id FROM users WHERE active = $1 ORDER BY created_at DESC LIMIT 10",
    [true]
);
$ids = pg_fetch_all_columns($result);
// Массив последних 10 активных ID
Пример 2: Получение столбца с алиасом
Пример php
$result = pg_query($conn, "
    SELECT u.id AS user_id,
           CONCAT(u.first_name, ' ', u.last_name) AS full_name
    FROM users u
");
$fullNames = pg_fetch_all_columns($result, 1); // Индекс 1 - столбец full_name
print_r($fullNames);
Пример 3: Преобразование типов данных
Пример php
// Получение массива целых чисел
$result = pg_query($conn, "SELECT id FROM products");
$ids = pg_fetch_all_columns($result);
// Явное приведение типов, если PostgreSQL драйвер возвращает строки
$ids = array_map('intval', $ids);
Пример 4: Работа с JSON данными из столбца
Пример php
$result = pg_query($conn, "SELECT json_data->>'tags' AS tags FROM documents");
$tagsJson = pg_fetch_all_columns($result);
$allTags = [];
foreach ($tagsJson as $json) {
    if ($json) {
        $decoded = json_decode($json, true);
        if (is_array($decoded)) {
            $allTags = array_merge($allTags, $decoded);
        }
    }
}
$uniqueTags = array_unique($allTags);
Пример 5: Использование в комбинации с array_combine
Пример php
// Создание ассоциативного массива id => name
$result = pg_query($conn, "SELECT id, name FROM cities");
$ids = pg_fetch_all_columns($result, 0);
$names = pg_fetch_all_columns($result, 1);
$cityMap = array_combine($ids, $names);
// $cityMap = [1 => 'Москва', 2 => 'Санкт-Петербург', ...]

PHP pg_fetch_all_columns function comments

En
Pg fetch all columns Fetches all rows in a particular result column as an array