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