Pg field name: примеры (PHP)
pg_field_name(PgSql\Result $result, int $field): stringФункция pg_field_name в PHP возвращает название поля (столбца) по его индексу в результате запроса PostgreSQL. Эта функция применяется при обработке данных, полученных из базы данных, когда требуется определить имя столбца по его порядковому номеру.
- $result (обязательный) - ресурс результата запроса, возвращаемый функциями pg_query(), pg_query_params() или pg_execute().
- $field_number (обязательный) - целочисленный индекс поля (начинается с 0).
Функция возвращает строку с именем поля или false при ошибке.
$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
Функция pg_field_num выполняет обратную операцию — возвращает индекс поля по его имени. Используется, когда известно название столбца, но требуется его порядковый номер.
Функции pg_fetch_assoc и pg_fetch_object возвращают данные результата запроса в виде ассоциативного массива или объекта, где ключами являются имена полей. Эти функции удобны для получения данных без явного указания индексов столбцов.
Функция pg_meta_data возвращает метаинформацию о таблице, включая имена полей, типы данных и другие атрибуты. Полезна для анализа структуры таблицы без выполнения запроса на выборку данных.
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']
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 аналогом является функция 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; // idid
$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 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) {}$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
)$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$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
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)