我正在使用此代码:
$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'循环结果是一个无限循环。怎么了?
答案 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();
}