2024年PHP开发者大会(日本)

pg_escape_string

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

pg_escape_string转义查询字符串

描述

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

pg_escape_string() 转义用于数据库查询的字符串。它返回一个以PostgreSQL格式转义的字符串,不带引号。pg_escape_literal() 是转义PostgreSQL SQL参数的更优选方法。addslashes() 不应与PostgreSQL一起使用。如果列的类型是 bytea,则必须使用pg_escape_bytea()。必须使用pg_escape_identifier() 来转义标识符(例如表名、字段名)。

注意:

此函数需要PostgreSQL 7.2或更高版本。

参数

connection

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

警告

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

data

包含要转义的文本的string

返回值

包含转义数据的string

变更日志

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

范例

示例 #1 pg_escape_string() 例子

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

// 读取文本文件(包含撇号和反斜杠)
$data = file_get_contents('letter.txt');

// 转义文本数据
$escaped = pg_escape_string($data);

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

参见

添加备注

用户贡献的备注 7 条备注

5
strata_ranger at hotmail dot com
14年前
对于那些好奇的人来说,对字符串执行的确切转义可能会根据您的数据库配置略有不同。

例如,如果数据库的 standard_conforming_strings 变量为 OFF,则反斜杠被视为特殊字符,pg_escape_string() 将确保它们被正确转义。如果此变量为 ON,则反斜杠将被视为普通字符,pg_escape_string() 将保留它们不变。无论哪种情况,行为都与数据库连接的配置匹配。
3
ringerc at ringerc dot id dot au
10年前
您应该更倾向于使用 pg_query_params,即使用参数化查询,而不是使用 pg_escape_string。或者使用具有参数化查询支持的较新的 PDO 接口。

如果必须直接替换值,例如在不支持作为参数化查询执行的 DDL 命令中,请使用 pg_escape_literal

http://au1.php.net/manual/en/function.pg-escape-literal.php

标识符不能用作查询参数。如果动态替换它们,请始终为它们使用 pg_escape_identifier

http://au1.php.net/manual/en/function.pg-escape-identifier.php

使用此函数时,您无需更改文本编码。确保您的连接的 client_encoding 设置为 PHP 使用的文本编码,PostgreSQL 客户端驱动程序将为您处理文本编码。使用正确设置的 client_encoding,无需显式 utf-8 转换。
2
Nathan Bruer
16年前
如果您的数据库是 UTF-8 数据库,您将遇到尝试将某些数据添加到数据库中的问题……

出于安全问题和/或兼容性问题,您可能需要使用:utf_encode() (https://php.net/utf8-encode) 函数。

例如
<?php
$my_data
= pg_escape_string(utf8_encode($_POST['my_data']));
?>
0
ppp
13年前
pg_escape_string() 不会像 php 通常那样将数组参数转换为“Array”字符串;它返回 NULL。以下语句都计算为 true

<?php
$a
= array('foo', 'bar');

"$a" == 'Array';
(string)
$a == 'Array';
$a . '' == 'Array';

is_null(pg_escape_string($a));
?>
0
johniskew2 at yahoo dot com
18年前
对于那些使用反斜杠转义单引号(例如 \')而不是使用连续两个单引号(例如 '')的人来说,最近出现了一个严重的SQL注入漏洞,可以利用您选择的转义方法进行攻击。更多信息请访问:https://postgresql.ac.cn/docs/techdocs.50
即使在PostgreSQL更新后,如果您仍然坚持使用反斜杠转义,您的查询功能仍然可能受到限制。这是一个教训,应该始终使用PHP函数进行正确的转义,而不是使用临时addslashes或magic_quotes转义。
0
meng
18年前
从PHP 5.1开始,引入了新的函数pg_query_params()。使用此函数,您可以使用绑定变量,而无需转义字符串。如果您可以使用它,请务必使用。如果不确定原因,请查看PostgreSQL 8.0.8的变更日志。
0
otix
18年前
使用双单引号完全没问题。它的作用与反斜杠单引号语法相同。摘自PostgreSQL文档:

字符串常量由单引号绑定这一事实带来了一个明显的语义问题,因为如果序列本身包含单引号,则常量的字面边界就会变得模糊。要在字符串中转义(使其成为字面量)单引号,您可以键入两个相邻的单引号。解析器将把字符串常量中的两个相邻单引号解释为单个字面单引号。PostgreSQL也允许使用C风格的反斜杠嵌入单引号。
To Top