PHP 的 PDO 可以限制为单个查询吗?

Posted

技术标签:

【中文标题】PHP 的 PDO 可以限制为单个查询吗?【英文标题】:Can PHP's PDO be limited to a single query? 【发布时间】:2011-02-17 15:22:08 【问题描述】:

php 的 PDO 允许通过 query() 方法或作为准备好的语句一次执行多个查询。以下两个示例都有效:

// Two SQL queries
$query = "SELECT * FROM table; DROP table;"

// Execute via query()
$pdo->query($query);

// Execute via prepared statement
$stmt = $pdo->prepare($query);
$stmt->execute();

有没有办法将 PDO 一次限制为一个查询,就像 mysql_query() 函数一样?

【问题讨论】:

【参考方案1】:

这是此问题的最新答案。

防止多查询执行的旧方法是禁用模拟准备,但这仅适用于PDO::prepare() 方法。在较新版本的 PHP(>= 5.5.21 和 >= 5.6.5)中,引入了一个新常量来禁用 PDO::prepare()PDO::query() 中的这种多查询执行。 (补丁版本中通常不会添加常量,但这样做是因为此功能带来的Drupal SQL injection attack 的严重性)。

新常量是PDO::MYSQL_ATTR_MULTI_STATEMENTS必须在对象创建时设置(作为 PDO 构造函数的第四个参数) - 用PDO::setAttribute() 将其设置在预先存在的对象上将不起作用.

$pdo = new PDO('mysql:host=_;dbname=_', '', '', [PDO::MYSQL_ATTR_MULTI_STATEMENTS => false]);

【讨论】:

我在 PHP 文档中没有找到任何关于 PDO::MYSQL_ATTR_MULTI_STATEMENTS 的信息。但我试过了,它有效; 我不知道它还没有被记录下来。我已将其添加到 MySQL's constants page - 它应该会在几个小时内看到。【参考方案2】:

嗯,有一种方法可以通过在 PDO 中禁用对准备好的语句的模拟以使其使用本机 mysql API 来实现这一点(服务器端准备好的语句不支持多查询):

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

但是,此选项的缺点之一是查询缓存丢失。

【讨论】:

"从 5.1.17 开始,prepared statements 在特定条件下使用查询缓存" - dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html 有没有办法通过 query() 方法阻止它? 我不知道,除非您使用一些自定义代码来过滤查询字符串。

以上是关于PHP 的 PDO 可以限制为单个查询吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PDO 在 php 中的多个查询与单个查询?

我可以在 PHP/PDO 中使用 PostgreSQL 简单查询模式吗?

你能用 PDO 查询帮助我理解这个 PHP 代码吗? [关闭]

使用 PHP PDO 在 SQL 中将多行传递给 UDF

是否可以使用 PHP 的 PDO Postgres 驱动程序查询 AWS Redshift?

PDO Prepared在单个查询中插入多行