PHP 8.4.1 Released!

pg_escape_bytea

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_escape_bytea 转义字符串以插入到 bytea 字段

说明

pg_escape_bytea(PgSql\Connection $connection = ?, string $data): string

pg_escape_bytea() 转义 bytea 数据类型的字符串。返回转义后的字符串。

注意:

SELECT bytea 类型时,PostgreSQL 返回前缀为“\”的八进制字节值(例如 \032)。用户需要手动转换为二进制格式。

本函数需要 PostgreSQL 7.2 及其更高版本。在 PostgreSQL 7.2.0 和 7.2.1 版中,如果使用了多字节支持,必须强制转换 bytea 类型。即 INSERT INTO test_table (image) VALUES ('$image_escaped'::bytea);,在 PostgreSQL 7.2.2 及其更高版本不需要强制转换。异常情况是当客户端和后端字符编码不匹配时,可能会有多字节流错误。然后用户必须强制转换 bytea 以避免此错误。

参数

connection

An PgSql\Connection instance. When connection is unspecified, the default connection is used. The default connection is the last connection made by pg_connect() or pg_pconnect().

警告

As of PHP 8.1.0, using the default connection is deprecated.

data

包含要插入到 bytea 列中的文本或二进制数据的 string

返回值

包含转义数据的 string

更新日志

版本 说明
8.1.0 现在 connection 参数接受 PgSql\Connection 实例,之前接受 resource

示例

示例 #1 pg_escape_bytea() 示例

<?php
// 连接到数据库
$dbconn = pg_connect('dbname=foo');

// 读入二进制文件
$data = file_get_contents('image1.jpg');

// 转义二进制数据
$escaped = pg_escape_bytea($data);

// 将其插入数据库
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', '{$escaped}')");
?>

参见

添加备注

用户贡献的备注 8 notes

up
8
ynzhang from lakeheadu of ca
15 years ago
The reason pg_unescape_bytea() do not exactly reproduce the binary data created by pg_escape_bytea() is because the backslash \ and single quote ' are double escaped by the pg_escape_bytea() function. This will lead to image seems corrupted when retrieve from the bytea field. The proper way to escape&unescape a binary string into a PG bytea field as follow:

<?php
$escaped_data
= str_replace(array("\\\\", "''"), array("\\", "'"), pg_escape_bytea($data));
/* and later unescape the escaped data from the bytea field with following to get the original binary data */

$original_data = pg_unescape_bytea($escaped_data));
?>

more details at: http://archives.postgresql.org/pgsql-php/2007-02/msg00014.php
up
4
Hayley Watson
7 years ago
PostgreSQL 9.0 introduced a new hexadecimal-based representation for bytea data that is preferred over the escaping mechanism implemented by this function.

<?php
function pg_escape_byteahex($binary)
{
return
"E'\\\\x".bin2hex($binary)."'";
}
?>
up
3
Mike-RaWare
14 years ago
To prevent any problems with encoding you could use hexadecimal or base64 input to save and retrieve data to the database:

<?php
// Connect to the database
$dbconn = pg_connect( 'dbname=foo' );

// Read in a binary file
$data = file_get_contents( 'image1.jpg' );

// Escape the binary data
$escaped = bin2hex( $data );

// Insert it into the database
pg_query( "INSERT INTO gallery (name, data) VALUES ('Pine trees', decode('{$escaped}' , 'hex'))" );

// Get the bytea data
$res = pg_query("SELECT encode(data, 'base64') AS data FROM gallery WHERE name='Pine trees'");
$raw = pg_fetch_result($res, 'data');

// Convert to binary and send to the browser
header('Content-type: image/jpeg');
echo
base64_decode($raw);
?>
up
1
Mocha
21 years ago
to unescape_bytea use stripcslashes(). If you need to escape bytea and don't have pg_escape_bytea() function then use:

<?php
function escByteA($binData) {
/**
* \134 = 92 = backslash, \000 = 00 = NULL, \047 = 39 = Single Quote
*
* str_replace() replaces the searches array in order. Therefore, we must
* process the 'backslash' character first. If we process it last, it'll
* replace all the escaped backslashes from the other searches that came
* before.
*/
$search = array(chr(92), chr(0), chr(39));
$replace = array('\\\134', '\\\000', '\\\047');
$binData = str_replace($search, $replace, $binData);
return
$binData;
//echo "<pre>$binData</pre>";
//exit;
}
?>
up
0
tabflo at gmx dot at
3 months ago
this method des the same as pg_escape_bytea have fun with it:

public function escape_bytea($data) {
$escaped = '';

for ($i = 0; $i < strlen($data); $i++) {
$char = $data[$i];
$ascii = ord($char);

$escaped.= ($ascii < 32 || $ascii > 126 ? sprintf('\\%03o', $ascii) : ($char == '\\' ? '\\\\' : $char) );
}
return $escaped;
}
up
0
Michael
10 years ago
using pg_escape_bytea without 'E' escape tag
<?php
// Die Binärdaten maskieren
$escaped = pg_escape_bytea($data);

// und in die Datenbank einfügen (falsch/wrong)
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', E'$escaped')");

// und in die Datenbank einfügen (richtig/right)
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', '$escaped')");
?>
up
0
gglockner AT NOSPAMdwaffler DOT com
15 years ago
If you're getting errors about nonstandard use of \\ in a string literal, then you need to escape the encoded bytea as follows:

<?php
$escaped
= pg_escape_bytea($data);
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', E'$escaped'::bytea)");
?>
up
-3
php at tobias dot olsson dot be
22 years ago
if you need to change back bytea from the db to normal data, this will do that:

<?php
function pg_unescape_bytea($bytea) {
return eval(
"return \"".str_replace('$', '\\$', str_replace('"', '\\"', $bytea))."\";");
}

// use like this
$rs = pg_query($conn, "SELECT image from images LIMIT 1");
$image = pg_unescape_bytea(pg_fetch_result($rs, 0, 0));
?>

/Tobias
To Top