当前位置: 首页 > 面试题库 >

严格标准:mysqli_multi_query出现mysqli_next_result()错误

寇和璧
2023-03-14
问题内容

我尝试使用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代码。 问题答案: 您应该删除(