Pg escape bytea: примеры (PHP)

Работа с pg_escape_bytea: сохранение бинарных данных в PostgreSQL
Раздел: Базы данных (PostgreSQL)
pg_escape_bytea(PgSql\Connection $connection, string $data): string

Функция pg_escape_bytea

Функция pg_escape_bytea экранирует специальные символы в строке для безопасного сохранения данных в поле типа bytea базы данных PostgreSQL. Использование требуется для предотвращения ошибок синтаксиса SQL и потенциальных инъекций при работе с бинарными данными.

Аргументы функции

Функция принимает до двух аргументов:

  • connection (необязательный, ресурс соединения): Идентификатор подключения к PostgreSQL. Если аргумент не указан, используется последнее соединение, открытое pg_connect() или pg_pconnect().
  • data (строка): Строка, содержащая бинарные данные для экранирования.

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

Базовое применение

Экранирование строки с бинарными данными для вставки в запрос.

<?
$conn = pg_connect("dbname=test");
$binary_data = file_get_contents('image.png');
$escaped = pg_escape_bytea($conn, $binary_data);
$query = "INSERT INTO images (data) VALUES ('{$escaped}')";
echo 'Данные экранированы';
?>
Данные экранированы
Использование без явного указания соединения
<?
$conn = pg_connect("dbname=test");
$data = "\x00\x01\x02";
$escaped = pg_escape_bytea($data);
echo bin2hex($escaped);
?>
5c7830305c7830315c783032

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

  • pg_escape_string — экранирует специальные символы в строковых литералах. Используется для текстовых полей, а не для бинарных данных.
  • pg_escape_literal — возвращает экранированное значение в виде корректного SQL-литерала. Более высокоуровневая функция, подходящая для разных типов данных, но менее специфична для bytea.
  • Подготовленные выражения (pg_prepare/pg_execute) — предпочтительный метод для безопасности, автоматически обрабатывающий экранирование. Использование параметризованных запросов устраняет необходимость ручного вызова pg_escape_bytea.

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

Python (psycopg2)
import psycopg2
conn = psycopg2.connect("dbname=test")
cursor = conn.cursor()
# Автоматическое экранирование через параметризованный запрос
binary_data = open('image.png', 'rb').read()
cursor.execute("INSERT INTO images (data) VALUES (%s)", (binary_data,))
JavaScript (Node.js, pg)
const { Client } = require('pg');
const client = new Client();
await client.connect();
// Параметризованные запросы автоматически экранируют данные
const binaryData = fs.readFileSync('image.png');
await client.query('INSERT INTO images (data) VALUES ($1)', [binaryData]);

Pg escape bytea в MySQL

-- Использование функции HEX() и UNHEX() для бинарных данных
INSERT INTO images (data) VALUES (UNHEX('012345'));
-- Или использование подготовленных выражений в сочетании с драйвером

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

Отсутствие подключения при использовании нескольких соединений
<?
$conn1 = pg_connect("dbname=test1");
$conn2 = pg_connect("dbname=test2");
$data = "\x00";
// Ошибка: экранирование будет применено к последнему соединению ($conn2)
$escaped = pg_escape_bytea($data);
$query = "INSERT INTO table1 (data) VALUES ('{$escaped}')"; // Может работать с неверной БД
?>
Двойное экранирование
<?
$conn = pg_connect("dbname=test");
$data = "test";
$escaped1 = pg_escape_bytea($conn, $data);
$escaped2 = pg_escape_bytea($conn, $escaped1); // Ошибка: двойное экранирование
$query = "INSERT INTO table (data) VALUES ('{$escaped2}')";
// В базе окажется некорректная строка
?>

Изменения в последних версиях PHP

В PHP 8.1 улучшена обработка ошибок при передаче неверных аргументов. Функция теперь более строго проверяет типы входных параметров. В PHP 8.0 было устранено несоответствие в поведении при работе с разными кодировками подключения к базе данных.

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

Работа с изображениями и выводом
Пример php
<?
$conn = pg_connect("dbname=gallery");
// Сохранение изображения
$image = file_get_contents('photo.jpg');
$escaped = pg_escape_bytea($conn, $image);
pg_query($conn, "INSERT INTO photos (img) VALUES ('{$escaped}')");

// Извлечение и отображение
$result = pg_query($conn, "SELECT img FROM photos WHERE id = 1");
$row = pg_fetch_assoc($result);
$image_data = pg_unescape_bytea($row['img']);
header('Content-Type: image/jpeg');
echo $image_data;
?>
Использование в подготовленных выражениях
Пример php
<?
$conn = pg_connect("dbname=test");
$data = file_get_contents('document.pdf');
$result = pg_prepare($conn, "insert_query", "INSERT INTO docs (content) VALUES ($1)");
$result = pg_execute($conn, "insert_query", array($data)); // Экранирование автоматическое
?>
Обработка больших бинарных объектов по частям
Пример php
<?
$conn = pg_connect("dbname=test");
$handle = fopen('large_video.mov', 'rb');
while (!feof($handle)) {
    $chunk = fread($handle, 8192);
    $escaped = pg_escape_bytea($conn, $chunk);
    // Инкрементальная обработка чанков
    pg_query($conn, "INSERT INTO chunks (data) VALUES ('{$escaped}')");
}
fclose($handle);
?>

PHP pg_escape_bytea function comments

En
Pg escape bytea Escape a string for insertion into a bytea field