调用mysqli_multi_query后如何获取所有错误?

时间:2011-10-23 09:22:10

标签: php mysql mysqli

我正在使用此代码:

$mysqli = new mysqli(...);

$sql = file_get_contents("my_sql_file.sql");
$result = $mysqli->multi_query($sql);

if (!$result)
  report_error(); //my function

while ($mysqli->more_results()) {
  $result = $mysqli->next_result();
  if (!$result)
    report_error();
}

然而,上面代码中的'while'循环结果是一个无限循环。怎么了?

2 个答案:

答案 0 :(得分:3)

实际上你的代码并没有多大意义。处理多个查询的正确方法如下(请参阅php manual

if ($mysqli->multi_query($query)) {
    do {
        // store first result set 
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_row()) {
                // do something with the row
            }
            $result->free();
        }
        else { error_report(); }
    } while ($mysqli->next_result());
}
else { error_report(); }

答案 1 :(得分:2)

问题中提供的代码到达了一个infitie循环,因为“如果你的第二个或后期查询没有返回任何结果,或者即使你的查询不是有效的SQL查询,more_results();在任何情况下都返回true。”,见这个关于php.net的注释:http://us3.php.net/manual/en/mysqli.multi-query.php#104076

此外,mysqli_more_results总是在代码中返回true,因为结果不会被丢弃,必须在每次调用mysqli_next_result后调用mysqli_store_results来丢弃结果。请参阅:http://us3.php.net/manual/en/mysqli.multi-query.php#91677

在mysqli_multi_query执行MySQL文本(由分号分隔的多个命令)时,没有正式的方法可以捕获所有错误。 mysqli_multi_query函数在面对错误的SQL命令时将停止执行,因此只能捕获第一个错误(无论错误发生在哪里,在第一个SQL命令或SQL文本中的任何其他SQL命令中)。

与Jon对此问题的回答相关:When does mysqli_multi_query stop execution?

http://www.php.net/manual/en/mysqli.multi-query.php#106126中所述,可以通过扫描mysqli_next_result来捕获第一个错误:$ mysqli-> next_result()如果语句用完,或者下一个语句有错误,则返回false。 / p>

最后答案是在使用mysqli_store_result调用mysqli_next_result后必须丢弃结果:

$mysqli = new mysqli(...);

$sql = file_get_contents("my_sql_file.sql");
$result = $mysqli->multi_query($sql);

if (!$result)
  report_error(); //my function

while ($mysqli->more_results()) {
  $result = $mysqli->next_result();

  //important to make mysqli_more_results false:
  $discard = $mysqli->store_result(); 

  if (!$result)
    report_error();
}