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

时间:2010-05-10 11:44:28

标签: php mysql pdo sql-injection

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()函数一样?

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:6)

这是对这个问题的最新答案。

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

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

PDO::setAttribute()