严格标准:mysqli_next_result()误差mysqli_multi_query严格标准:

2019-06-17 09:52发布

我一直在使用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()来检查是否调用这个函数/方法

我试着添加和删除-; 但没有运气。

Answer 1:

虽然pipodesign在$查询字符串中更正错误,并缓解了问题,对于严格的标准,误差不提供实际的解决方案。

我不同意SirBT的建议,从DO时更改,同时是没有必要的。

您收到的严格标准的消息是相当有价值的信息。 要服从,使用此:

do{} while(mysqli_more_results($db) && mysqli_next_result($db));

然后,就没有必要给你写有条件退出或循环的内部中断,因为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编辑:

由于人们新的mysqli跨越这个帖子磕磕绊绊,我会提供一个通用而强大的片段使用multi_query()来处理与/查询无结果集和新增功能,显示的查询数组中被处理?

经典的“if(){DO {}虽然}”语法

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((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

每次修改你的需求我的片段。 发表评论,如果你发现一个bug。



Answer 2:

为什么你得到这样的警告的原因,完全是因为你使用do ... while循环,运行命令块之后计算该条件。 因此,当没有更多的结果,循环的内容跑到一个额外的时间,产生一个警告。

使用while ($mysql->next_result()) ... do循环应该解决这个问题。 (在一般注意事项:使用后测试循环像你这样是很罕见的数据库编程)

如果代码是诗,我想是莎士比亚!



Answer 3:

(发布代表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";


文章来源: Strict Standards: mysqli_next_result() error with mysqli_multi_query