Pg convert: примеры (PHP)
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
)$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.
Аналоги в других языках и СУБД
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 нет.
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 = 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
)$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'
)$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);
// Двоичные данные корректно экранируются