Pg field num: примеры (PHP)
pg_field_num(PgSql\Result $result, string $field): intФункция pg_field_num() возвращает порядковый номер (индекс) поля по его имени в результате запроса к базе данных PostgreSQL. Индексация начинается с нуля. Функция применяется для динамической обработки результатов SQL-запросов, когда имена столбцов известны, но требуется получить их позицию для использования с функциями вроде pg_fetch_result().
- $result (ресурс PostgreSQL) – обязательный. Ресурс результата запроса, возвращаемый функциями
pg_query(),pg_query_params()илиpg_execute(). - $field_name (строка) – обязательный. Название поля (столбца) в результате запроса.
Функция возвращает целое число (номер поля) или false в случае ошибки (например, если указано несуществующее имя поля).
$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)
- pg_field_name() – получает название поля по его номеру. Обратная операция к
pg_field_num(). - pg_num_fields() – возвращает количество полей в результате запроса.
- pg_fetch_assoc() или pg_fetch_object() – позволяют получать данные по имени столбца без необходимости знать его индекс. Часто удобнее для прямого доступа к данным.
Функцию pg_field_num() предпочтительнее использовать, когда требуется именно индекс поля для низкоуровневой обработки или совместимости с другими функциями, ожидающими номер поля.
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
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
$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 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();
}$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];
}$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;
}$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