【问题标题】:How to get error message with mysqli::multi_query?如何使用 mysqli::multi_query 获取错误消息?
【发布时间】:2012-09-05 18:38:47
【问题描述】:

这是我正在尝试的:

if($mysqli->multi_query(file_get_contents('file_that_contains_a_bunch_of.sql'))) {
    do {
        $result = $mysqli->use_result();
        if($mysqli->errno === 0) {
            echo $mysqli->affected_rows.' row(s) affected'.PHP_EOL;
        } else {
            die($mysqli->error);
        }
    } while($mysqli->next_result());
}

但它会提前中止循环并且不会打印错误消息。如何找出错误是什么?

【问题讨论】:

  • 您应该在die() 调用中收到错误消息。
  • @MikeBrant:没有达到这个目标——这就是问题所在。
  • 为什么不使用 mysql 的 exec 转储?
  • @JvdBerg:这是一个更大脚本的一部分。

标签: php mysqli


【解决方案1】:

彼得删除了他的答案,但它暗示了问题所在。我必须将错误检查放在循环之外。

下面的一切,我需要写

if($mysqli->errno) die($mysqli->error)

如果 next 查询出错,next_result 函数会返回 false,因此它甚至不会进入循环体。

【讨论】:

    【解决方案2】:

    如果你以某种方式配置mysqli_report,它可能会中止循环,寻找这样的字符串

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    

    在这种情况下,每次你都会尝试这样做

    $mysqli->use_result();
    

    如果没有结果,例如如果有“set”、“insert”、“update”或“delete”类型的查询,则会生成错误。

    你找到获取错误信息的方法了吗?

    【讨论】:

    • 这是几年前的事了,但是是的,我想是的。见my answer
    • 根据我的经验,即使某些查询失败,“multi_query”也会返回 true,这就是原因 - 检查它没有意义,您可以消除“if”语句。但是你可以添加一些东西:如果你使用“START TRANSACTION;”和“承诺”;在您的 SQL 脚本中,您可以避免一些问题。我的意思是,默认情况下 PHP 不会为“multi_query”启动事务。
    • mysqli::multi_query ONLY 如果第一条语句失败,则返回 FALSE。从这里dev.mysql.com/doc/apis-php/en/apis-php-mysqli.multi-query.html
    • 我没有得到简单的答案,所以我发明了轮子,请在此处查看我对同一问题的回答:stackoverflow.com/questions/7395326/…
    【解决方案3】:

    使用此代码效果很好

    while ($conn->more_results()){
         $conn->next_result();
         echo $conn->error;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 2011-06-27
      • 2018-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 2022-01-21
      相关资源
      最近更新 更多