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 可以限制为单个查询吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 PHP/PDO 中使用 PostgreSQL 简单查询模式吗?
你能用 PDO 查询帮助我理解这个 PHP 代码吗? [关闭]