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 实例;以前需要 resource

范例

范例 #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}')");
?>

参见

添加注释

用户贡献注释 11 个注释

strata_ranger at hotmail dot com
14 年前
对于那些好奇的人来说,对字符串执行的确切转义可能因您的数据库配置而异。

例如,如果您的数据库的 standard_conforming_strings 变量为 OFF,则反斜杠将被视为特殊字符,并且 pg_escape_string() 将确保它们被正确转义。如果此变量为 ON,则反斜杠将被视为普通字符,并且 pg_escape_string() 将保持原样。无论哪种情况,行为都与数据库连接的配置匹配。
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 转换。
Nathan Bruer
16 年前
如果您的数据库是 UTF-8 数据库,您将遇到尝试将某些数据添加到您的数据库中的问题...

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

例如
<?php
$my_data
= pg_escape_string(utf8_encode($_POST['my_data']));
?>
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));
?>
johniskew2 at yahoo dot com
18 年前
对于那些使用反斜杠转义单引号(即 \') 而不是连续两个单引号(即 '')的人来说,最近出现了一个严重的 SQL 注入漏洞,可以利用您选择的转义方法。更多信息请参见:https://postgresql.ac.cn/docs/techdocs.50
即使在 postgres 更新之后,如果您仍然坚持使用反斜杠转义,您可能仍然会限制您对查询的操作。这是一个教训,始终使用 PHP 函数进行正确的转义,而不是临时 addslashes 或 magic quotes 转义。
meng
18 年前
自从 php 5.1 引入了新的函数 pg_query_params()。使用此函数,您可以使用绑定变量,而无需转义字符串。如果您可以使用它,请这样做。如果不确定原因,请查看 Postgres 8.0.8 的变更日志。
otix
18 年前
创建双引号完全没问题。它与反斜杠-引号语法的工作原理相同。来自 PostgreSQL 文档

字符串常量由单引号绑定这一事实提出了一个明显的语义问题,因为如果序列本身包含单引号,则常量的文字边界将变得模棱两可。要在字符串中转义(使文字)单引号,您可以键入两个相邻的单引号。解析器会将字符串常量中的两个相邻单引号解释为单个文字单引号。PostgreSQL 还允许使用 C 样式反斜杠来嵌入单引号。
Gautam Khanna
16 年前
您使用的安全方法取决于具体目的。对于那些不知道的人,请查看以下内置 PHP 函数

strip_tags() 用于删除 HTML 字符
(另请参阅 htmlspecialchars)

escapeshellarg() 用于转义 shell 命令等
escapeshellcmd()

mysql_real_escape_string() 用于转义 mySQL 命令。

享受!

web dot expert dot panel at gmail dot com
efjiolvwejlojfwel at mailinator dot com
6 年前
为了更好地服务互联网,请添加一个提示开发人员使用预处理语句和占位符,并弃用此函数及其相关函数(但不要弃用 pg_escape_identifier)。
将数据和 SQL 代码混合到一个字符串中,然后再发送到 RDBMS,这是没有正当理由的,这样做会导致 SQL 注入漏洞。因此,无需对数据进行转义。因此,无需使用此函数。向开发人员提供他们不需要也不应该使用的功能会让人感到困惑。
strata_ranger at hotmail dot com
13 年前
这可能看起来很明显,但请记住,pg_escape_string 会对值进行转义,以便在 SQL 查询中用作字符串文字——如果您需要对任意字符串进行转义以便用作 SQL 标识符(列名等),则似乎没有 PHP 函数可以执行此操作,因此您必须自己进行转义。(PostgreSQL 有一个数据库内部函数 quote_ident(),可以执行此操作。)

如果您的数据库包含混合大小写(或其他不常见的)列名,并且您有一个类接口来管理您的数据库/查询交互(用于连接到不同类型的数据库),则这可能是一个问题。如果您没有用双引号括起列名,则 postgreSQL 会不区分大小写地匹配它们,但会以全小写形式标记结果(这与 MySQL 不同)。

例如

<?php
// 纯列标识符
$res = pg_query("Select columnName from table");
$row = pg_fetch_assoc($res);

var_dump($row['columnName']); // 不起作用(引发 E_NOTICE)
var_dump($row['columnname']); // 起作用

// 转义的列标识符
$res = pg_query("Select \"columnName\" from table");
$row = pg_fetch_assoc($res);

var_dump($row['columnName']); // 起作用
var_dump($row['columnname']); // 不起作用
?>
arunintellirise at gmail dot com
6 年前
PostgreSQL 是一款功能强大且开源的对象关系型数据库,拥有 15 年以上的活跃开发历史,并拥有经过验证的架构,重点关注可扩展性和标准合规性。PostgreSQL 的主要功能是安全地存储数据,并根据其他软件应用程序(已获得可靠性、数据完整性和正确性的良好声誉)的请求返回这些数据,这些应用程序在包括 Linux、UNIX 和 Windows 在内所有主要操作系统上运行。PostgreSQL 是一个跨平台的开源数据库,其源代码免费提供,不受任何公司或其他私人实体的控制。PostgreSQL 还支持存储二进制大型对象,包括图片、声音或视频,以及处理从小型单机应用程序到大型面向互联网应用程序(拥有大量并发用户)的各种工作负载。PostgreSQL 在数据量方面具有高度可扩展性,支持国际字符集和多字节字符编码。
如果您想了解更多关于此说明的信息,请访问我们的网站。
https://www.codesroom.com/blog/postgresql
To Top