【问题标题】:Can PHP's PDO be limited to a single query?PHP 的 PDO 可以限制为单个查询吗?
【发布时间】: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() 函数一样?

【问题讨论】:

    标签: php mysql pdo sql-injection


    【解决方案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);
    

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-18
    • 2021-12-23
    • 2014-03-02
    • 2011-02-17
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    相关资源
    最近更新 更多