为什么不用分号连接多个MySQL查询与Perl DBI一起使用?

时间:2012-11-11 16:47:12

标签: mysql perl dbi

我想使用DBI将值插入两个单独的MySQL表中。我试图通过在它们之间插入INSERT将两个有效的;个查询合并为一个:

$dbh->do(q{
    INSERT INTO `testA`(test) values('testvalue111');
    INSERT INTO `testB`(test) values('testvalue222');
});

但我总是收到错误:

  

“INSERT INTO`testB`(测试)值中的语法错误('testvalue222 ...”

如果我将查询分成两个单独的do个调用,则可以正常运行。但组合查询在phpMyAdmin中工作正常。为什么它在Perl中失败?

3 个答案:

答案 0 :(得分:7)

您需要在connect调用中设置一个选项以启用此选项。来自the docs

  

mysql_multi_statements
  从MySQL 4.1开始,可以使用此选项启用对以分号(;)分隔的多个语句的支持。如果还启用了服务器端预处理语句,则启用此选项可能会导致问题。

默认情况下禁用它,并且可能应该保持未设置状态 - 这是SQL注入的一个很大的途径(特别是如果你没有使用绑定,你应该阅读它)。

答案 1 :(得分:0)

默认情况下,DBD :: mysql不允许您一次执行多个语句。虽然可以使用mysql_multi_statements选项Mat showed启用此功能,但您不应该这样做:除其他外,您的代码将不太可移植,因为某些数据库驱动程序不会有任何这样的选择,它可能会导致准备好的陈述出现问题。

相反,只需为每个语句发出单独的DBI命令。

答案 2 :(得分:-2)

INSERT INTO testA(测试)值('testvalue111'),('testvalue222');