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

一个 PgSql\Connection 实例。当 connection 未指定时,将使用默认连接。默认连接是 pg_connect()pg_pconnect() 建立的最后一个连接。

警告

从 PHP 8.1.0 开始,使用默认连接已弃用。

data

一个 string,包含要插入 bytea 列的文本或二进制数据。

返回值

一个 string,包含转义后的数据。

变更日志

版本 描述
8.1.0 connection 参数现在期望一个 PgSql\Connection 实例;以前,期望一个 资源

范例

范例 #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 条注释

8
ynzhang from lakeheadu of ca
15 年前
pg_unescape_bytea() 不能完全复制由 pg_escape_bytea() 创建的二进制数据的原因是,pg_escape_bytea() 函数对反斜杠 \ 和单引号 ' 进行双重转义。这会导致从 bytea 字段检索到的图像似乎已损坏。以下是用正确的方式将二进制字符串转义和解除转义到 PG bytea 字段的方法

<?php
$escaped_data
= str_replace(array("\\\\", "''"), array("\\", "'"), pg_escape_bytea($data));
/* 然后使用以下方法对从 bytea 字段中获取的转义数据进行解除转义,以获取原始二进制数据 */

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

更多详细信息请访问:http://archives.postgresql.org/pgsql-php/2007-02/msg00014.php
4
Hayley Watson
7 年前
PostgreSQL 9.0 引入了一种新的基于十六进制的 bytea 数据表示形式,它优于此函数实现的转义机制。

<?php
function pg_escape_byteahex($binary)
{
return
"E'\\\\x".bin2hex($binary)."'";
}
?>
3
Mike-RaWare
14 年前
为了防止任何编码问题,您可以使用十六进制或 base64 输入来保存和检索数据到数据库

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

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

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

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

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

// 转换为二进制并发送到浏览器
header('Content-type: image/jpeg');
echo
base64_decode($raw);
?>
1
Mocha
21 年前
要解除 bytea 的转义,请使用 stripcslashes()。如果您需要转义 bytea 并且没有 pg_escape_bytea() 函数,请使用

<?php
function escByteA($binData) {
/**
* \134 = 92 = 反斜杠,\000 = 00 = NULL,\047 = 39 = 单引号
*
* str_replace() 按顺序替换搜索数组。因此,我们必须
* 首先处理“反斜杠”字符。如果我们最后处理它,它将
* 替换之前所有搜索中所有转义的反斜杠。
*/
$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;
}
?>
0
tabflo at gmx dot at
14 天前
此方法与 pg_escape_bytea 类似,祝您玩得开心

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;
}
0
Michael
10 年前
使用 pg_escape_bytea 而不使用“E”转义标签
<?php
// 掩盖二进制数据
$escaped = pg_escape_bytea($data);

// 并将其插入数据库(错误/wrong)
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', E'$escaped')");

// 并将其插入数据库(正确/right)
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', '$escaped')");
?>
0
gglockner AT NOSPAMdwaffler DOT com
15 年前
如果您遇到有关在字符串文字中非标准使用 \\ 的错误,则需要按如下方式转义编码的 bytea

<?php
$escaped
= pg_escape_bytea($data);
pg_query("INSERT INTO gallery (name, data) VALUES ('Pine trees', E'$escaped'::bytea)");
?>
-3
php at tobias dot olsson dot be
21 年前
如果您需要将数据库中的 bytea 更改回正常数据,此操作将执行此操作

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

// 像这样使用
$rs = pg_query($conn, "SELECT image from images LIMIT 1");
$image = pg_unescape_bytea(pg_fetch_result($rs, 0, 0));
?>

/Tobias
To Top