Pg convert: примеры (PHP)

Полное руководство по pg_convert с примерами на PHP
Раздел: Базы данных (PostgreSQL)
pg_convert(PgSql\Connection $connection, string $table_name, array $values, int $flags = 0): array|false

Описание функции pg_convert

Назначение и использование

Функция pg_convert() преобразует значения ассоциативного массива PHP в пригодные для использования в SQL-запросах к PostgreSQL, экранируя спецсимволы и приводя типы данных в соответствие с целевой таблицей. Она часто применяется перед вставкой или обновлением записей через pg_insert() или pg_update() для безопасного формирования запросов.

Аргументы функции
pg_convert(PgSql\Connection $connection, string $table_name, array $values, int $flags = 0): array|false

$connection - обязательный параметр, объект соединения с PostgreSQL.

$table_name - имя таблицы, в которую предполагается вставка данных.

$values - ассоциативный массив данных, где ключи соответствуют именам столбцов таблицы.

$flags - опциональный параметр, комбинация констант: PGSQL_CONV_IGNORE_DEFAULT (игнорировать значения по умолчанию), PGSQL_CONV_FORCE_NULL (преобразовывать пустые строки в NULL), PGSQL_CONV_IGNORE_NOT_NULL (игнорировать ограничения NOT NULL).

Простые примеры использования

Базовое преобразование
$conn = pg_connect("host=localhost dbname=test user=postgres");
$data = ['name' => "O'Reilly", 'age' => 30, 'salary' => 5000.50];
$converted = pg_convert($conn, 'employees', $data);
print_r($converted);
Array
(
    [name] => 'O''Reilly'
    [age] => 30
    [salary] => 5000.50
)
Использование флага PGSQL_CONV_FORCE_NULL
$data = ['name' => '', 'comment' => 'test'];
$converted = pg_convert($conn, 'table', $data, PGSQL_CONV_FORCE_NULL);
print_r($converted);
Array
(
    [name] => NULL
    [comment] => 'test'
)

Похожие функции в PHP

Экранирует значение для использования в SQL. Работает со скалярными значениями, а не с массивами. Удобна для ручного формирования запросов.

Экранирует идентификаторы (имена таблиц, столбцов). Используется для безопасной подстановки имен объектов БД.

Запрашивает параметры сервера. Не выполняет преобразование данных, но полезна для получения информации о подключении.

Функция pg_convert предпочтительна при работе с ассоциативными массивами данных для вставки/обновления, особенно в сочетании с pg_insert.

Аналоги в других языках и СУБД

Python (psycopg2)
import psycopg2
conn = psycopg2.connect("dbname=test")
cursor = conn.cursor()
data = {"name": "O'Reilly", "age": 30}
cursor.execute("INSERT INTO employees (name, age) VALUES (%s, %s)", (data['name'], data['age']))

Параметризованные запросы выполняют экранирование автоматически. Прямого аналога pg_convert нет.

JavaScript (Node.js, pg)
const { Client } = require('pg');
const client = new Client();
await client.connect();
const data = { name: "O'Reilly", age: 30 };
const res = await client.query('INSERT INTO employees(name, age) VALUES($1, $2)', [data.name, data.age]);

Используются параметризованные запросы с плейсхолдерами $1, $2.

MySQLi (PHP)
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$stmt = $mysqli->prepare("INSERT INTO employees (name, age) VALUES (?, ?)");
$stmt->bind_param('si', $name, $age);

Подготовленные выражения обеспечивают безопасную подстановку. В MySQLi нет функции, аналогичной pg_convert.

Типичные ошибки

Несуществующая таблица или столбец
$data = ['name' => 'test'];
$result = pg_convert($conn, 'unknown_table', $data);
var_dump($result);
bool(false)

Функция возвращает false, если таблица или столбец не найдены. Важно проверять результат.

Несоответствие типов данных
$data = ['id' => 'not_a_number'];
// Предположим, что столбец id имеет тип integer
$result = pg_convert($conn, 'table_with_int_id', $data);
// Преобразование пройдет, но последующий запрос вызовет ошибку в БД

Функция не проверяет логическую корректность типов, только экранирует значения.

Отсутствующее соединение
$conn = null;
$result = pg_convert($conn, 'test', ['a' => 1]);
// Warning: pg_convert(): supplied resource is not a valid PostgreSQL link resource

Изменения в PHP 8

В PHP 8.0 функция pg_convert теперь ожидает объект PgSql\Connection вместо ресурса (resource). Это часть общего перехода на объекты для расширений баз данных.

Сигнатура была изменена с:

pg_convert(resource $connection, string $table_name, array $values, int $flags = 0)

на:

pg_convert(PgSql\Connection $connection, string $table_name, array $values, int $flags = 0)

Старый код с передачей ресурса продолжит работу, но будет выдавать предупреждение о устаревании в PHP 8.1.

Расширенные примеры

Комбинирование флагов
$data = ['name' => '', 'age' => 0, 'comment' => NULL];
$flags = PGSQL_CONV_FORCE_NULL | PGSQL_CONV_IGNORE_DEFAULT;
$converted = pg_convert($conn, 'users', $data, $flags);
print_r($converted);
Array
(
    [name] => NULL
    [age] => 0
    [comment] => NULL
)
Работа с различными типами данных PostgreSQL
$data = [
    'json_field' => '{"key": "value"}',
    'array_field' => '{1,2,3}',
    'bool_field' => true,
    'date_field' => '2023-12-31'
];
$converted = pg_convert($conn, 'table_with_complex_types', $data);
print_r($converted);
Array
(
    [json_field] => '{"key": "value"}'
    [array_field] => '{1,2,3}'
    [bool_field] => true
    [date_field] => '2023-12-31'
)
Использование с pg_insert
$data = ['product' => 'Laptop', 'price' => 999.99];
$converted = pg_convert($conn, 'products', $data);
if ($converted) {
    $res = pg_insert($conn, 'products', $converted);
    echo $res ? 'Inserted' : 'Error';
}
Обработка больших двоичных данных
$binaryData = file_get_contents('image.png');
$data = ['id' => 1, 'image' => $binaryData];
$converted = pg_convert($conn, 'images', $data);
// Двоичные данные корректно экранируются

PHP pg_convert function comments

En
Pg convert Convert associative array values into suitable for SQL statement