一尘不染

PDO支持多个查询(PDO_MYSQL,PDO_MYSQLND)

mysql

我确实知道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运行多个查询。


阅读 478

收藏
2020-05-17

共1个答案

一尘不染

据我所知,已在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注入

2020-05-17