PDO支持多个查询(PDO_MYSQL,PDO_MYSQLND)
我确实知道PDO不支持在一条语句中执行多个查询。我一直在Google搜索,发现很少有关于PDO_MYSQL和PDO_MYSQLND的帖子。
PDO_MySQL是一个比其他任何传统MySQL应用程序更危险的应用程序。传统的MySQL仅允许一个SQL查询。在PDO_MySQL中没有这样的限制,但是您可能会被注入多个查询。
来自: 使用PDO和Zend Framework防止SQL注入
(2010年6月;朱利安(Julian))
似乎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();
}
一张纸条:
使用模拟的准备好的语句时,请确保已在DSN中设置了正确的编码(反映了实际的数据编码)(自5.3.6起可用)。否则,如果使用某种奇数编码,则可能会有少量的SQL注入。
以上是 PDO支持多个查询(PDO_MYSQL,PDO_MYSQLND) 的全部内容, 来源链接: utcz.com/qa/415080.html