严格的标准: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";
你得到这个警告的原因很简单,因为你使用了一个do
… while
循环,它在运行命令块后评估条件。 所以当没有更多的结果时,循环的内容会再运行一次,产生警告。
使用一段while ($mysql->next_result())
… do
循环应该解决这个问题。 (一般来说:像你一样使用后测循环在数据库编程中是很less见的)
如果代码是诗歌,我想成为莎士比亚!