我确实知道PDO不支持在一条语句中执行多个查询。我一直在Google搜索,发现很少有关于PDO_MYSQL和PDO_MYSQLND的帖子。
PDO_MySQL是一个比其他任何传统MySQL应用程序更危险的应用程序。传统的MySQL仅允许一个SQL查询。在PDO_MySQL中没有这样的限制,但是您可能会被注入多个查询。
来自:使用PDO和Zend Framework防止SQL注入(2010年6月;朱利安)
似乎PDO_MYSQL和PDO_MYSQLND确实提供了对多个查询的支持,但我无法找到有关它们的更多信息。这些项目被中止了吗?现在有什么方法可以使用PDO运行多个查询。
据我所知,已在PHP 5.3中PDO_MYSQLND替换PDO_MYSQL。令人困惑的是,名字仍然是PDO_MYSQL。因此,现在ND是MySQL + PDO的默认驱动程序。
总体而言,一次执行多个查询需要:
PHP 5.3以上 mysqlnd 模拟准备好的语句。确保PDO::ATTR_EMULATE_PREPARES设置为1(默认)。另外,您可以避免使用准备好的语句而$pdo->exec直接使用。 使用执行
$db = new PDO("mysql:host=localhost;dbname=test", 'root', '');
// works regardless of statements emulation $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);
$sql = " DELETE FROM car; INSERT INTO car(name, type) VALUES ('car1', 'coupe'); INSERT INTO car(name, type) VALUES ('car2', 'coupe'); ";
try { $db->exec($sql); } catch (PDOException $e) { echo $e->getMessage(); die(); } 使用语句
$db = new PDO("mysql:host=localhost;dbname=test", 'root', '');
// works not with the following set to 0. You can comment this line as 1 is default $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
$sql = " DELETE FROM car; INSERT INTO car(name, type) VALUES ('car1', 'coupe'); INSERT INTO car(name, type) VALUES ('car2', 'coupe'); ";
try { $stmt = $db->prepare($sql); $stmt->execute(); } catch (PDOException $e) { echo $e->getMessage(); die(); } 来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。