我尝试过使用multi_query但是我一直在弹出严格的标准消息。
$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()来检查是否要调用此函数/方法
我尝试添加和删除-;
,但没有运气。
答案 0 :(得分:28)
虽然pipodesign纠正了$ querystring中的错误并缓解了问题,但没有提供有关严格标准错误的实际解决方案。
我不同意SirBT的建议,不需要从DO WHILE更改为WHILE。
您收到的严格标准信息非常有用。 要服从,请使用:
do{} while(mysqli_more_results($db) && mysqli_next_result($db));
然后,您无需在循环内部编写条件退出或中断,因为while条件将在第一次出现错误时中断循环。 *注意,如果第一个查询有错误,do-while之前的if语句将拒绝进入循环。
在您的示例中,您只运行INSERT查询,因此您无法接收要处理的任何结果集。如果您想要计算已添加的行数,请使用mysqli_affected_rows()。
作为您问题的完整解决方案:
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
LATE EDIT:
由于mysqli的新手在这篇文章中遇到了绊脚石,我将提供一个通用但强大的代码片段,使用multi_query()处理带/不带结果集的查询,并添加一个功能来显示数组中的哪个查询处理...
经典" 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
重新发明的轮子&#34;在{}&#34;语法(...对于那些不喜欢测试后循环的人):
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
根据您的需要修改我的代码段。如果您发现了错误,请发表评论。
答案 1 :(得分:1)
您收到此警告的原因仅仅是因为您使用do
... while
循环来运行命令块后评估条件。因此,当没有更多结果时,循环的内容再运行一次,产生该警告。
使用while ($mysql->next_result())
... do
循环应解决此问题。 (总的来说:在数据库编程中使用像你一样的测试后循环非常罕见)
如果代码是诗歌,我正试图成为莎士比亚!
答案 2 :(得分:0)
(代表OP发表答案)。
解决:
void*