【问题标题】:Why doesn't joining multiple MySQL queries with semicolons work with Perl DBI?为什么用分号连接多个 MySQL 查询不能与 Perl DBI 一起使用?
【发布时间】:2017-03-03 02:59:13
【问题描述】:

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

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

但我总是得到一个错误:

“INSERT INTO `testB`(test) values('testvalue222 ...”中的语法错误

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

【问题讨论】:

    标签: mysql perl dbi


    【解决方案1】:

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

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

    默认情况下它是禁用的,并且应该保持未设置 - 这是 SQL 注入的一个重要途径(你应该阅读它,特别是如果你不使用绑定)。

    【讨论】:

    • 不过,最好使用单独的调用来简化可读性。
    • 合并调用是为了提高性能,谢谢!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      INSERT INTO testA(test) values('testvalue111'),('testvalue222');

      【讨论】:

      • 跳过正在插入两个不同的表。
      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2011-10-06
      • 2013-02-03
      • 1970-01-01
      • 2014-01-28
      • 2017-10-26
      • 2011-02-13
      相关资源
      最近更新 更多