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

回到顶部