严格的标准:mysqli_next_result()错误与mysqli_multi_query

我曾尝试使用multi_query,但我不断得到一个严格的标准消息popup。

$querystring = "INSERT INTO responses VALUES('1', '2', '3', '4'); INSERT INTO responses VALUES('1', '2', '3', '4')"; if (mysqli_multi_query($db, $querystring)) { do { if ($result = mysqli_store_result($db)) { // } } while (mysqli_next_result($db)); } echo "end"; 

我得到的错误消息是:

严格标准 :mysqli_next_result():没有下一个结果集。 请调用mysqli_more_results()/ mysqli :: more_results()来检查是否调用这个函数/方法

我试过添加和删除-; 但没有运气。

虽然pipodesign纠正$查询string中的错误,并缓解了这个问题,但没有提供有关严格标准错误的实际解决scheme。

我不同意SirBT的build议,从DO WHILE改成WHILE是没有必要的。

您收到的严格标准信息是相当丰富的。 服从,使用这个:

 do{} while(mysqli_more_results($db) && mysqli_next_result($db)); 

然后,不需要在循环中写入条件退出或中断,因为while条件会在首次出现错误时中断循环。 *注意,如果第一个查询有错误,do-while之前的if语句将拒绝进入循环。

在你的例子中,你只运行INSERT查询,所以你不会收到任何结果集来处理。 如果要计算已添加的行数,请使用mysqli_affected_rows()。

作为您的问题的完整解决scheme:

 if(mysqli_multi_query($db,$querystring)){ do{ $cumulative_rows+=mysqli_affected_rows($db); } while(mysqli_more_results($db) && mysqli_next_result($db)); } if($error_mess=mysqli_error($db)){echo "Error: $error_mess";} echo "Cumulative Affected Rows: $cumulative_rows"; 

输出:

  // if no errors Cumulative Affected Rows: 2 // if error on second query Error: [something] Cumulative Affected Rows: 1 // if error on first query Error: [something] Cumulative Affected Rows: 0 

后期编辑:

由于mysqli的新手都在这篇文章中磕磕绊绊,所以我将提供一个通用而健壮的代码片断来处理使用multi_query()的结果集查询,并添加一个特性来显示正在处理的数组中的哪个查询。

Classic“IF(){DO {} WHILE}”语法

 if(mysqli_multi_query($mysqli,implode(';',$queries))){ do{ echo "<br><br>",key($queries),": ",current($queries); // display key:value @ pointer if($result=mysqli_store_result($mysqli)){ // if a result set while($rows=mysqli_fetch_assoc($result)){ echo "<br>Col = {$rows["Col"]}"; } mysqli_free_result($result); } echo "<br>Rows = ",mysqli_affected_rows($mysqli); // acts like num_rows on SELECTs } while(next($queries) && mysqli_more_results($mysqli) && mysqli_next_result($mysqli)); } if($mysqli_error=mysqli_error($mysqli)){ echo "<br><br>",key($queries),": ",current($queries),"Syntax Error:<br>$mysqli_error"; // display array pointer key:value } //if you want to use the snippet again... $mysqli_error=null; // clear variables reset($queries); // reset pointer 

重塑轮“WHILE {}”语法 (…对于那些不喜欢后testing循环):

 while((isset($multi_query) && (next($queries) && mysqli_more_results($mysqli) && mysqli_next_result($mysqli))) || (!isset($multi_query) && $multi_query=mysqli_multi_query($mysqli,implode(';',$queries)))){ echo "<br><br>",key($queries),": ",current($queries); // display array pointer key:value if($result=mysqli_store_result($mysqli)){ while($rows=mysqli_fetch_assoc($result)){ echo "<br>Col = {$rows["Col"]}"; } mysqli_free_result($result); } echo "<br>Rows = ",mysqli_affected_rows($mysqli); // acts like num_rows on SELECTs } if($mysqli_error=mysqli_error($mysqli)){ echo "<br><br>",key($queries),": ",current($queries),"Syntax Error:<br>$mysqli_error"; // display array pointer key:value } //if you want to use the snippet again... $multi_query=$mysqli_error=null; // clear variables reset($queries); // reset pointer 

所以,给出以下查询的代码片断将提供相同的输出:

查询数组:

 $queries[]="SELECT * FROM `TEST`"; $queries[]="INSERT INTO `TEST` (Col) VALUES ('string1'),('string2')"; $queries[]="SELECT * FROM `TEST`"; $queries[]="DELETE FROM `TEST` WHERE Col LIKE 'string%'"; 

输出:

 0: SELECT * FROM `TEST` Rows = 0 1: INSERT INTO `TEST` (Col) VALUES ('string1'),('string2') Rows = 2 2: SELECT * FROM `TEST` Col = string1 Col = string2 Rows = 2 3: DELETE FROM `TEST` WHERE Col LIKE 'string%' Rows = 2 

根据您的需求修改我的片段。 如果发现错误,请留下评论。

(代表OP发布回答)

解决了:

 $querystring = "INSERT INTO responses VALUES('1', '2', '3', '4'); INSERT INTO responses VALUES('1', '2', '3', '4')"; if (mysqli_multi_query($db, $querystring)) { do { if (!mysqli_more_results($db)) { exit(); } } while (mysqli_next_result($db)); } echo "end"; 

你得到这个警告的原因很简单,因为你使用了一个dowhile循环,它在运行命令块后评估条件。 所以当没有更多的结果时,循环的内容会再运行一次,产生警告。

使用一段while ($mysql->next_result())do循环应该解决这个问题。 (一般来说:像你一样使用后测循环在数据库编程中是很less见的)

如果代码是诗歌,我想成为莎士比亚!