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

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

Функция pg_field_num() возвращает порядковый номер (индекс) поля по его имени в результате запроса к базе данных PostgreSQL. Индексация начинается с нуля. Функция применяется для динамической обработки результатов SQL-запросов, когда имена столбцов известны, но требуется получить их позицию для использования с функциями вроде pg_fetch_result().

Аргументы функции
  • $result (ресурс PostgreSQL) – обязательный. Ресурс результата запроса, возвращаемый функциями pg_query(), pg_query_params() или pg_execute().
  • $field_name (строка) – обязательный. Название поля (столбца) в результате запроса.

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

Примеры использования pg_field_num
Базовый пример: получение номера поля
$conn = pg_connect('host=localhost dbname=test');
$result = pg_query($conn, 'SELECT id, name, email FROM users');
$fieldIndex = pg_field_num($result, 'email');
echo 'Номер поля email: ' . $fieldIndex;
Номер поля email: 2
Обработка отсутствующего поля
$result = pg_query($conn, 'SELECT id FROM users');
$fieldIndex = pg_field_num($result, 'phone');
var_dump($fieldIndex);
bool(false)
Похожие функции в PHP
  • pg_field_name() – получает название поля по его номеру. Обратная операция к pg_field_num().
  • pg_num_fields() – возвращает количество полей в результате запроса.
  • pg_fetch_assoc() или pg_fetch_object() – позволяют получать данные по имени столбца без необходимости знать его индекс. Часто удобнее для прямого доступа к данным.

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

Аналоги в других языках и СУБД
Python (библиотека psycopg2)
import psycopg2
conn = psycopg2.connect('host=localhost dbname=test')
cur = conn.cursor()
cur.execute('SELECT id, name FROM users')
# Получение индекса по имени через описание курсора
field_names = [desc[0] for desc in cur.description]
try:
    index = field_names.index('name')
    print(index)
except ValueError:
    print('Поле не найдено')
1
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');
// Поля доступны в res.fields
const fieldIndex = res.fields.findIndex(f => f.name === 'name');
console.log(fieldIndex);
1
MySQL (PHP, расширение mysqli)
$conn = new mysqli('localhost', 'user', 'pass', 'test');
$result = $conn->query('SELECT id, name FROM users');
// В mysqli прямой функции нет, но можно получить через fetch_field_direct
$field = $result->fetch_field_direct(1);
echo $field->name; // Имя поля по индексу
name
Типичные ошибки
Передача неверного ресурса
$result = false; // Не ресурс
$index = pg_field_num($result, 'id');
// Вызовет предупреждение и вернет false
Использование после закрытия результата
$result = pg_query($conn, 'SELECT id FROM users');
pg_free_result($result);
$index = pg_field_num($result, 'id'); // Неверный ресурс
Чувствительность к регистру имени поля
$result = pg_query($conn, 'SELECT 'id' as UserId FROM users');
// Имя поля в БД в кавычках - 'UserId', но без кавычек оно может быть приведено к нижнему регистру
$index = pg_field_num($result, 'userid'); // Может не сработать
$index2 = pg_field_num($result, 'UserId'); // Вернет номер, если имя сохранилось как есть
Изменения в версиях PHP

В PHP 8.0 существенных изменений в поведении pg_field_num() не было. Однако, начиная с PHP 8.1, все функции модуля PgSQL выбрасывают исключения в случае ошибок, если только не используется обработчик ошибок через set_error_handler. Ранее функция возвращала false и генерировала предупреждение.

// PHP 8.1+
try {
    $index = pg_field_num($result, 'несуществующее_поле');
} catch (ValueError $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
Расширенные примеры
Динамическое построение карты полей
Пример php
$result = pg_query($conn, 'SELECT * FROM products LIMIT 0');
$fieldMap = [];
for ($i = 0; $i < pg_num_fields($result); $i++) {
    $name = pg_field_name($result, $i);
    $fieldMap[$name] = $i; // Создание ассоциативного массива имя => номер
}
// Теперь можно быстро получить номер по имени
$needField = 'price';
if (isset($fieldMap[$needField])) {
    echo 'Номер поля price: ' . $fieldMap[$needField];
}
Использование с pg_fetch_result
Пример php
$result = pg_query($conn, 'SELECT id, name FROM users WHERE id = 1');
$fieldNum = pg_field_num($result, 'name');
if ($fieldNum !== false) {
    $value = pg_fetch_result($result, 0, $fieldNum); // Получение значения по индексу строки и номера поля
    echo $value;
}
Обработка результата с псевдонимами полей
Пример php
$result = pg_query($conn, 'SELECT count(*) as total_count FROM users');
$index = pg_field_num($result, 'total_count'); // Работает с псевдонимом
echo 'Индекс поля total_count: ' . $index;
Индекс поля total_count: 0

PHP pg_field_num function comments

En
Pg field num Returns the field number of the named field