我知道PDO不支持在一条语句中执行多个查询.我一直在谷歌上搜索,发现很少有帖子谈论PDO_MYSQL和PDO_MYSQLND.

pdo_mysql是一个更危险的 应用程序比任何其他传统应用程序都要好 MySQL应用程序.传统MySQL 仅允许单个SQL查询.在……里面 PDO_MySQL没有这样的限制, 但你冒着被注射的风险 多个查询.

出发地:Protection against SQL Injection using PDO and Zend Framework (June 2010; by Julian)

看起来PDO_MYSQL和PDO_MYSQLND确实提供了对多个查询的支持,但我无法找到关于它们的更多信息.这些项目停止了吗?现在有没有办法使用PDO运行多个查询.

推荐答案

据我所知,在PHP5.3中,PDO_MYSQLND取代了PDO_MYSQL.令人困惑的是,这个名字仍然是PDO_MYSQL.现在ND是MySQL+PDO的默认驱动程序.

总的来说,要一次执行多个查询,您需要:

  • PHP5.3+
  • mysqlnd
  • 模仿事先准备好的陈述.确保将PDO::ATTR_EMULATE_PREPARES设置为1(默认).或者,您可以避免使用预先准备好的语句,直接使用$pdo->exec.

Using 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');
";

$db->exec($sql);

Using statements

$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');
";

$stmt = $db->prepare($sql);
$stmt->execute();

注:

当使用模拟的准备好的语句时,确保在DSN中设置了正确的编码(反映实际的数据编码)(从5.3.6开始提供).否则there can be a slight possibility for SQL injection if some odd encoding is used.

Php相关问答推荐

未找到laravel cascadeOnEdit

管理员订单列表中的自定义列与WooCommerce 8.6.1一起消失

模型中的Laravel自定义查询字段

在特定订单状态更改时自定义WooCommerce订单发货项目

创建一个新的可变产品及其属性以用于WooCommerce中的变体

使用列入黑名单的单词和自定义业务逻辑的组合将特定的子字符串包装在HTML标记中

PHP MySQL求和子树并与父树累加

PHP从响应应用程序json获取文件代码和URL

列出所有WooCommerce处理订单中的产品数量,SKU和品牌

从两个日期创建日期范围,然后为范围中的每个日期复制子数组

如何按类别过滤自定义帖子类型

如何使用定制的StateProvider设置JsonLd@上下文?

Shopware 6插件:由于删除了配置密钥,更新后配置值不正确

无法允许元素(img:'src')与symfony html-sanitizer(symfony6.3 php 8.2)

Firefox 115 会话行为:为什么页面无法找到要加载的现有会话 ID?

PHP - 计算非数值数组

.htaccess环境变量条件不被判断

PDO 和 SQL 查询结果中日期格式不同的原因可能是什么?

PHP / DOM : 解析 HTML 以提取基于类的数​​据

为什么 8.0 之前的 PHP 版本拒绝命名空间Random\Namespace作为无效语法?