对于那些好奇的人来说,对字符串执行的确切转义可能会根据您的数据库配置略有不同。
例如,如果数据库的 standard_conforming_strings 变量为 OFF,则反斜杠被视为特殊字符,pg_escape_string() 将确保它们被正确转义。如果此变量为 ON,则反斜杠将被视为普通字符,pg_escape_string() 将保留它们不变。无论哪种情况,行为都与数据库连接的配置匹配。
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
pg_escape_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}')");
?>
对于那些好奇的人来说,对字符串执行的确切转义可能会根据您的数据库配置略有不同。
例如,如果数据库的 standard_conforming_strings 变量为 OFF,则反斜杠被视为特殊字符,pg_escape_string() 将确保它们被正确转义。如果此变量为 ON,则反斜杠将被视为普通字符,pg_escape_string() 将保留它们不变。无论哪种情况,行为都与数据库连接的配置匹配。
您应该更倾向于使用 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 转换。
如果您的数据库是 UTF-8 数据库,您将遇到尝试将某些数据添加到数据库中的问题……
出于安全问题和/或兼容性问题,您可能需要使用:utf_encode() (https://php.net/utf8-encode) 函数。
例如
<?php
$my_data = pg_escape_string(utf8_encode($_POST['my_data']));
?>
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));
?>
对于那些使用反斜杠转义单引号(例如 \')而不是使用连续两个单引号(例如 '')的人来说,最近出现了一个严重的SQL注入漏洞,可以利用您选择的转义方法进行攻击。更多信息请访问:https://postgresql.ac.cn/docs/techdocs.50
即使在PostgreSQL更新后,如果您仍然坚持使用反斜杠转义,您的查询功能仍然可能受到限制。这是一个教训,应该始终使用PHP函数进行正确的转义,而不是使用临时addslashes或magic_quotes转义。