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

Определение длины вывода полей PostgreSQL через pg_field_prtlen
Раздел: Базы данных (PostgreSQL)
pg_field_prtlen(PgSql\Result $result, $row = ?, $field = ?): int|false
Описание функции pg_field_prtlen

Функция pg_field_prtlen в PHP предназначена для получения длины строкового представления значения поля из результата запроса PostgreSQL. Она возвращает количество символов, которые будут выведены при отображении значения, что может отличаться от фактического размера данных в байтах.

Назначение

Использование функции актуально при форматировании вывода данных, когда требуется определить занимаемое поле место в текстовом представлении. Это полезно для генерации отчетов, табличного вывода или при работе с системами, где важен визуальный формат.

Аргументы функции
pg_field_prtlen(resource $result, int $row_number, mixed $field_name_or_number): int | false
pg_field_prtlen(resource $result, mixed $field_name_or_number): int | false
  • $result — ресурс результата запроса PostgreSQL, возвращаемый функциями pg_query(), pg_query_params() или pg_execute().
  • $row_number — номер строки в результате (начиная с 0). Этот параметр опционален. Если он не указан, используется текущая строка.
  • $field_name_or_number — имя поля (строка) или его номер (начиная с 0).

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

Короткие примеры использования
Пример 1: Базовое использование
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($conn, "SELECT id, name FROM products");
$length = pg_field_prtlen($result, 0, 'name');
echo "Длина значения в первом ряду, поле 'name': ".$length;
Длина значения в первом ряду, поле 'name': 12
Пример 2: Использование номера поля
$result = pg_query($conn, "SELECT id, name, price FROM products");
$length = pg_field_prtlen($result, 1, 2); // Вторая строка, третье поле (price)
echo "Длина: ".$length;
Длина: 7
Пример 3: Без указания номера строки
$result = pg_query($conn, "SELECT description FROM products");
pg_fetch_row($result); // Перемещаемся к первой строке
$length = pg_field_prtlen($result, 'description'); // Для текущей строки
echo "Длина: ".$length;
Длина: 24
Похожие функции в PHP

Функция pg_field_size() возвращает внутренний размер поля в байтах. Она полезна для определения фактического объема данных, но не учитывает форматирование при выводе.

Функция pg_field_name() получает имя поля по его номеру. Используется для получения метаинформации о структуре результата запроса.

Функция pg_field_type() возвращает имя типа данных поля. Помогает в динамическом анализе структуры результатов.

Рекомендации: pg_field_prtlen применяют для задач форматирования вывода. Для работы с размерами данных в хранилище используют pg_field_size. Для получения метаданных результата — pg_field_name и pg_field_type.

Аналоги в других языках и системах
Python (библиотека psycopg2)
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()
cur.execute("SELECT name FROM products")
row = cur.fetchone()
length = len(str(row[0]))
print(f"Длина: {length}")
Длина: 12
JavaScript (Node.js с библиотекой pg)
const { Client } = require('pg');
const client = new Client();
(async () => {
  await client.connect();
  const res = await client.query('SELECT name FROM products');
  const length = String(res.rows[0].name).length;
  console.log(`Длина: ${length}`);
})();
Длина: 12

Pg field prtlen в MySQL

В MySQL нет прямой аналогии. Для определения длины строкового представления используют функцию CHAR_LENGTH() в самом запросе.

SELECT name, CHAR_LENGTH(name) AS prtlen FROM products;
| name | prtlen |
|------------|--------|
| Product A  | 9      |
Отличия

В отличие от аналогов в Python и JavaScript, функция pg_field_prtlen работает с ресурсом результата, не требуя предварительного извлечения данных в переменные. Это позволяет экономить память при работе с большими объемами данных.

Типичные ошибки
Ошибка 1: Неверный ресурс результата
$length = pg_field_prtlen(null, 0, 'name');
var_dump($length);
bool(false)

Возникает, когда передан неверный или пустой ресурс. Всегда проверяйте результат выполнения pg_query.

Ошибка 2: Выход за границы строк
$result = pg_query($conn, "SELECT name FROM products LIMIT 1");
$length = pg_field_prtlen($result, 5, 'name'); // Строки 5 не существует
echo "Длина: ".$length;
Warning: pg_field_prtlen(): Bad row offset
Ошибка 3: Неверное имя или номер поля
$result = pg_query($conn, "SELECT name FROM products");
$length = pg_field_prtlen($result, 0, 'nonexistent');
var_dump($length);
bool(false)

Убедитесь, что указанное имя или номер поля существуют в результате запроса.

Изменения в версиях PHP

Функция pg_field_prtlen была добавлена в PHP 4.2.0. Существенных изменений в поведении функции в последних версиях PHP не было. Однако начиная с PHP 7.0, при неверных параметрах функция возвращает false и генерирует предупреждение, тогда как в более ранних версиях поведение могло отличаться.

PHP 8.x

В PHP 8 сохраняется обратная совместимость. Типизация аргументов стала строже, но сигнатура функции не изменилась.

Расширенные примеры использования
Пример 1: Форматирование таблицы
Пример php
$result = pg_query($conn, "SELECT id, name, price FROM products LIMIT 5");
$fieldCount = pg_num_fields($result);

// Определяем ширину столбцов
$widths = [];
for ($i = 0; $i < $fieldCount; $i++) {
    $maxLen = strlen(pg_field_name($result, $i));
    for ($j = 0; $j < pg_num_rows($result); $j++) {
        $len = pg_field_prtlen($result, $j, $i);
        if ($len > $maxLen) $maxLen = $len;
    }
    $widths[$i] = $maxLen + 2;
}

// Вывод заголовков
for ($i = 0; $i < $fieldCount; $i++) {
    printf("%-{$widths[$i]}s", pg_field_name($result, $i));
}
echo "\n";

// Вывод данных
while ($row = pg_fetch_row($result)) {
    for ($i = 0; $i < $fieldCount; $i++) {
        printf("%-{$widths[$i]}s", $row[$i]);
    }
    echo "\n";
}
id  name       price 
1   Product A  100.00
2   Product B  200.50
3   Product C  150.75
Пример 2: Обработка NULL-значений
Пример php
$result = pg_query($conn, "SELECT NULL as null_value, '' as empty_string");
$len1 = pg_field_prtlen($result, 0, 'null_value');
$len2 = pg_field_prtlen($result, 0, 'empty_string');
echo "NULL длина: ".$len1."\n";
echo "Пустая строка длина: ".$len2;
NULL длина: 0
Пустая строка длина: 0
Пример 3: Специфические типы данных
Пример php
$result = pg_query($conn, "SELECT current_date as date, 123.456::numeric as num");
$dateLen = pg_field_prtlen($result, 0, 'date');
$numLen = pg_field_prtlen($result, 0, 'num');
echo "Дата: ".$dateLen." символов\n";
echo "Число: ".$numLen." символов";
Дата: 10 символов
Число: 7 символов
Пример 4: Многострочные тексты
Пример php
$result = pg_query($conn, "SELECT 'Много\nстрочный\nтекст' as multiline");
$len = pg_field_prtlen($result, 0, 'multiline');
echo "Длина с учетом символов новой строки: ".$len;
Длина с учетом символов новой строки: 18

PHP pg_field_prtlen function comments

En
Pg field prtlen Returns the printed length