Pg field name: примеры (PHP)

Использование pg_field_name для получения имен полей
Раздел: Базы данных (PostgreSQL)
pg_field_name(PgSql\Result $result, int $field): string
Описание функции pg_field_name

Функция pg_field_name в PHP возвращает название поля (столбца) по его индексу в результате запроса PostgreSQL. Эта функция применяется при обработке данных, полученных из базы данных, когда требуется определить имя столбца по его порядковому номеру.

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

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

Примеры использования pg_field_name
Получение имени поля по индексу
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($conn, "SELECT id, name, age FROM users");
echo pg_field_name($result, 0); // id
echo pg_field_name($result, 1); // name
echo pg_field_name($result, 2); // age
pg_close($conn);
id
name
age
Использование в цикле
$result = pg_query($conn, "SELECT * FROM products LIMIT 1");
$fieldCount = pg_num_fields($result);
for ($i = 0; $i < $fieldCount; $i++) {
    echo $i . ': ' . pg_field_name($result, $i) . "\n";
}
0: id
1: title
2: price
3: category_id
Похожие функции в PHP

Функция pg_field_num выполняет обратную операцию — возвращает индекс поля по его имени. Используется, когда известно название столбца, но требуется его порядковый номер.

pg_fetch_assoc и pg_fetch_object

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

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

Аналоги в других языках
Python (psycopg2)
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()
cur.execute("SELECT id, name FROM users")
# Получение имен столбцов
col_names = [desc[0] for desc in cur.description]
print(col_names)  # ['id', 'name']
['id', 'name']
JavaScript (Node.js, pg библиотека)
const { Client } = require('pg');
const client = new Client({ user: 'postgres', database: 'test' });
await client.connect();
const res = await client.query('SELECT id, name FROM users');
// Имена полей находятся в массиве fields
console.log(res.fields.map(f => f.name)); // ['id', 'name']
['id', 'name']
MySQL (PHP)

В MySQL аналогом является функция mysqli_fetch_field_direct, которая возвращает объект с информацией о поле, включая имя.

$mysqli = new mysqli("localhost", "user", "pass", "test");
$result = $mysqli->query("SELECT id, name FROM users");
$field = $result->fetch_field_direct(0);
echo $field->name; // id
id
Типичные ошибки
Неверный индекс поля
$result = pg_query($conn, "SELECT id, name FROM users");
// Попытка получить имя несуществующего поля
$name = pg_field_name($result, 5);
var_dump($name);
bool(false)
Использование неверного ресурса
$conn = pg_connect("host=localhost dbname=test user=postgres");
// Передача соединения вместо результата запроса
$fieldName = pg_field_name($conn, 0);
var_dump($fieldName);
bool(false)
Работа с закрытым соединением
$result = pg_query($conn, "SELECT id FROM users");
pg_close($conn);
// Попытка использования результата после закрытия соединения
$name = pg_field_name($result, 0);
var_dump($name);
bool(false)
Изменения в последних версиях PHP

В PHP 8.1 был изменен тип первого аргумента: вместо ресурса (resource) теперь используется объект PgSql\Result. Это изменение связано с переходом на объектно-ориентированную модель для расширений баз данных. Старый код, использующий ресурсы, продолжает работать, но выводится предупреждение о устаревании.

// До PHP 8.1
$result = pg_query($conn, "SELECT id FROM users");
var_dump($result); // resource(5) of type (pgsql result)

// Начиная с PHP 8.1
$result = pg_query($conn, "SELECT id FROM users");
var_dump($result); // object(PgSql\Result)#2 (0) {}
Расширенные примеры
Динамическое построение ассоциативного массива
Пример php
$result = pg_query($conn, "SELECT * FROM users WHERE id = 1");
$row = pg_fetch_row($result);
$assocRow = [];
for ($i = 0; $i < pg_num_fields($result); $i++) {
    $fieldName = pg_field_name($result, $i);
    $assocRow[$fieldName] = $row[$i];
}
print_r($assocRow);
Array
(
    [id] => 1
    [name] => John
    [age] => 25
)
Сопоставление индексов полей для оптимизации
Пример php
$result = pg_query($conn, "SELECT id, name, email, age FROM users");
$fieldIndexes = [];
for ($i = 0; $i < pg_num_fields($result); $i++) {
    $fieldName = pg_field_name($result, $i);
    $fieldIndexes[$fieldName] = $i;
}
// Быстрый доступ к индексу по имени поля
$emailIndex = $fieldIndexes['email']; // 2
Формирование CSV-заголовков
Пример php
$result = pg_query($conn, "SELECT * FROM products");
$headers = [];
for ($i = 0; $i < pg_num_fields($result); $i++) {
    $headers[] = pg_field_name($result, $i);
}
echo implode(';', $headers);
id;title;price;category_id;created_at
Проверка существования поля
Пример php
function fieldExists($result, $fieldName) {
    for ($i = 0; $i < pg_num_fields($result); $i++) {
        if (pg_field_name($result, $i) === $fieldName) {
            return true;
        }
    }
    return false;
}
$result = pg_query($conn, "SELECT id, name FROM users");
var_dump(fieldExists($result, 'name')); // bool(true)
var_dump(fieldExists($result, 'address')); // bool(false)

PHP pg_field_name function comments

En
Pg field name Returns the name of a field