php - 严格标准 : mysqli_next_result() error with mysqli_multi_query

标签 php mysqli standards strict mysqli-multi-query

我已经尝试使用 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";

我得到的错误信息是:

Strict Standards: mysqli_next_result(): There is no next result set. Please, call mysqli_more_results()/mysqli::more_results() to check whether to call this function/method

我试过添加和删除 -; 但没有成功。

最佳答案

虽然 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

后期编辑:

由于 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 - 严格标准 : mysqli_next_result() error with mysqli_multi_query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14715889/

相关文章:

php - 布局 xml 中的 Magento 条件 block

php - PHP邮件功能无法完成电子邮件的发送

php - 使用 Laravel、PHPSpec 和 PHPUnit 测试模型和服务

c++ - 在逗号运算符中,如果没有副作用,是否保证左操作数不会实际执行?

php - MySQL 在 codeigniter 中选择格式的日期

php - 如何使用循环向表中插入数据。?

java - 无法在 android 中的服务器 mysqli/Php 上发布数据

php - 使用PHP从多个数据库表中获取数据

c++ - 有没有比 vector< vector< T>> 更自然的方式来表示 T 的矩阵?

c++ - 可以使用 "and"、 "or"等代替 "&&"、 "||"吗?