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