我尝试使用multi_query,但我不断弹出严格的Standards消息。
$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纠正了$ querystring中的错误并缓解了该问题,但未提供有关Strict Standards错误的实际解决方案。
我不同意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
后期编辑:
由于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
重塑Wheel“ WHILE {}”语法 (…对于那些不喜欢测试后循环的人):
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
根据您的需求修改我的代码段。如果发现错误,请发表评论。
问题内容: 我需要在顶部设置PHP脚本以禁用严格标准的错误报告。 有人可以帮忙吗? 问题答案: 您要禁用错误报告,还是只是阻止用户查看错误报告?即使在生产站点上,记录错误也通常是一个好主意。 它们将被记录到您的标准系统日志中,或者使用伪指令来指定您希望错误出现的确切位置。
问题内容: 我目前正在php 5.4上运行一个站点,在此之前我在5.3.8上运行了我的站点。不幸的是,php 5.4结合了和,这意味着我之前的设置现在无法正常工作。我以前的值是我应该一次启用一个值吗? 我有太多错误,文件包含太多代码供我修复。 问题答案: 正如评论者所说, 最好的 选择是修复错误,但时间或知识有限,这并非总是可能的。在您的php.ini中更改 至 如果您无权访问php.ini,则可
问题内容: 我有一个奇怪的问题,如果可以解决,那就太好了。出于调试目的(以及其他一些目的),我在标准输出上编写了控制台Java应用程序的日志。在标准输出上写一些内容,在标准错误上打印一些错误,例如错误。问题是这两个没有完全同步,因此打印线的顺序并不总是正确的。我猜这是因为打印了很多东西,并且碰巧一个输出的缓冲区已满,所以其他输出在第一个输出刷新其缓冲区之前就已打印出来。 例如,我想这样写: 有时打
我刚刚在PHP 5.4上安装了woocommerce 2.0(在Wordpress上),我得到了这个: 严格标准:WC_Gateway_BACS::process_payment()的声明应与D:\my\path\to\htdocs\wordpress\plugins\woocommerce\classs\Gateway\BACS\class WC-Gateway-BACS中的WC_payment
问题内容: 是否可以在Python中临时重定向stdout / stderr(即在方法期间)? 编辑: 当前解决方案的问题(我最初记得但后来忘记了)是它们没有 重定向 ;相反,它们只是完全替换了流。因此,如果某个方法由于某种原因(例如,由于将流作为参数传递给某物)而具有该变量的 本地 副本,则该方法将无效。 有什么办法吗? 问题答案: 要解决某些函数可能已将流作为局部变量缓存的问题,因此替换全局变
问题内容: 我将PHP版本升级到5.4(XAMPP 1.7.3到1.8.0)。现在,我看到“ 严格标准” 错误,原因是: 严格的标准:在第4行的C:\ xampp \ htdocs \ alous \ include \ dbconn.php中,只能通过引用分配变量 dbconn.php: 注意: 我不需要使用此方法在php.ini中禁用严格标准!我想修复我的PHP代码。 问题答案: 您应该删除(