Pg field type: примеры (PHP)
pg_field_type(PgSql\Result $result, int $field): stringОсновные сведения о функции pg_field_type
Функция pg_field_type в PHP предназначена для определения типа данных конкретного поля в результате запроса к базе данных PostgreSQL. Она возвращает строку, содержащую имя типа PostgreSQL (например, 'int4', 'varchar', 'date'). Эта функция часто используется при динамической обработке результатов запросов, когда структура таблицы неизвестна заранее или требуется валидация типов данных.
Функция принимает два параметра:
- $result (ресурс) — обязательный параметр, представляющий результат запроса, возвращенный функциями
pg_query,pg_query_paramsилиpg_send_query. - $field_number (целое число) — обязательный параметр, указывающий порядковый номер поля в результате. Нумерация начинается с 0.
Простые примеры использования
Базовый пример получения типа данных для первого поля в результате запроса.
<?
$conn = pg_connect('dbname=test');
$result = pg_query($conn, 'SELECT id, username FROM users');
$fieldType = pg_field_type($result, 0);
echo $fieldType;
?>int4
Пример перебора всех полей результата для вывода их типов.
<?
$conn = pg_connect('dbname=test');
$result = pg_query($conn, 'SELECT id, email, created_at FROM users');
$fieldCount = pg_num_fields($result);
for ($i = 0; $i < $fieldCount; $i++) {
echo pg_field_name($result, $i) . ': ' . pg_field_type($result, $i) . "\n";
}
?>id: int4 email: varchar created_at: timestamp
Аналогичные функции в PHP
Функция pg_field_type_oid возвращает идентификатор типа (OID) поля вместо его имени. Используется, когда необходима точная идентификация типа через системные каталоги PostgreSQL.
Функция pg_field_name предоставляет имя поля по его номеру. Часто применяется совместно с pg_field_type для полного описания структуры результата.
Функция pg_field_size возвращает внутренний размер хранилища поля. Полезно при оптимизации запросов и анализе использования памяти.
Аналоги в других языках и системах
В библиотеке psycopg2 тип поля можно получить через свойство cursor.description.
import psycopg2
conn = psycopg2.connect('dbname=test')
cur = conn.cursor()
cur.execute('SELECT id, name FROM users')
print(cur.description[0].type_code) # Получение кода типа23 # Код типа integer
В node-postgres информация о типах доступна через свойство fields результата запроса.
const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT id FROM users');
console.log(res.fields[0].dataTypeID);23
Pg field type в MySQL
В MySQL аналогом является функция mysql_fetch_field.
$conn = mysqli_connect('localhost', 'user', 'pass', 'test');
$result = mysqli_query($conn, 'SELECT id FROM users');
$field = mysqli_fetch_field($result);
echo $field->type;3 (MYSQLI_TYPE_LONG)
Распространенные ошибки
Передача отрицательного числа или номера, превышающего количество полей, вызывает предупреждение.
<?
$conn = pg_connect('dbname=test');
$result = pg_query($conn, 'SELECT id FROM users');
$type = pg_field_type($result, 5);
?>Warning: pg_field_type(): Field number is out of range
Попытка использования ресурса, не связанного с результатом запроса.
<?
$conn = pg_connect('dbname=test');
$type = pg_field_type($conn, 0);
?>Warning: pg_field_type() expects parameter 1 to be resource, resource given
Изменения в версиях PHP
В PHP 8.0 функция pg_field_type была изменена для строгой типизации параметров. Аргумент $field_number теперь должен быть целым числом (int). В PHP 8.1 функция возвращает более точные имена типов для некоторых специализированных типов данных PostgreSQL, таких как массивы и пользовательские типы.
Расширенные примеры применения
Функция корректно определяет пользовательские типы данных, созданные в PostgreSQL.
<?
$conn = pg_connect('dbname=test');
pg_query($conn, 'CREATE TYPE mood AS ENUM (''sad'', ''ok'', ''happy'')');
$result = pg_query($conn, 'CREATE TABLE person (current_mood mood)');
$result = pg_query($conn, 'SELECT current_mood FROM person');
echo pg_field_type($result, 0);
?>mood
Для полей-массивов функция возвращает базовый тип с суффиксом '[]'.
<?
$conn = pg_connect('dbname=test');
$result = pg_query($conn, 'SELECT ARRAY[1,2,3] as numbers');
echo pg_field_type($result, 0);
?>int4[]
Совместное применение с функцией получения OID для точной идентификации.
<?
$conn = pg_connect('dbname=test');
$result = pg_query($conn, 'SELECT id, name FROM users');
for ($i = 0; $i < pg_num_fields($result); $i++) {
$name = pg_field_name($result, $i);
$type = pg_field_type($result, $i);
$oid = pg_field_type_oid($result, $i);
echo "$name: $type (OID: $oid)\n";
}
?>id: int4 (OID: 23) name: varchar (OID: 1043)