8

我想了解 Whatmysqli_store_result实际上是做什么的?当我访问 的PHP 手册mysqli_store_result,我找到了定义

mysqli_store_result — Transfers a result set from the last query

问题是它在哪里传输结果集?"Commands out of sync; you can't run this command now"实际上我在执行后得到了错误mysqli_multi_query但是当我使用以下方法时,错误消失了。

 mysqli_multi_query($connection,$query);

do
{
    mysqli_store_result($connection);
}
while(mysqli_next_result($connection));

现在,我应该在每个之后还是之后使用它mysqli_store_result($connection),因为我已经在 PHP Manaul 中阅读过mysqli_next_result($connection)mysqli_querymysqli_multi_query

“虽然使用 mysqli_free_result() 函数释放查询结果所使用的内存始终是一种好习惯,但在使用 mysqli_store_result() 传输大型结果集时,这一点变得尤为重要。”

来源:PHP:mysqli_store_result

又出现一个问题 当我执行上述操作时,mysqli_multi_query($connection,$query);我发表了echo 'storing result <br />'如下声明

do
{
    echo 'storing result <br />
    mysqli_store_result($connection);
}
while(mysqli_next_result($connection));

虽然 $query 中只有两个 INSERT 查询,但它给出了以下输出

storing result
storing result
storing result
storing result

这意味着有四个结果集被转移。我无法理解这种情况。最后一个问题。上述do while过程是否会影响性能?

4

2 回答 2

7

之前的评论已经声明mysqli_store_result()不能与 INSERT 语句一起使用,但没有人提到实际的适当功能:mysqli_affected_rows(). 如果您的语句返回一个记录集并且您想以数字方式检查它,请使用mysqli_num_rows().

如果处理混合物,这可能会让你开始:

$queries[] = "INSERT INTO TestTable (Column1) VALUES ('TEST1')";
$queries[] = "SELECT * FROM TestTable WHERE Column1 LIKE 'TEST%'";
$queries[] = "INSERT INTO TestTable (Column1) VALUES ('TEST2')";
$queries[] = "SELECT * FROM TestTable WHERE Column1 LIKE 'TEST%'";
$queries[] = "DELETE FROM TestTable WHERE Column1 LIKE 'TEST%'";

if(mysqli_multi_query($con, implode(';', $queries))){
    do{
        if($result = mysqli_store_result($con)){
            echo "Selected rows = " . mysqli_num_rows($result) . "<br><br>";
            mysqli_free_result($result);
        }else{
            $cumulative_rows += $aff_rows = mysqli_affected_rows($con);
            echo "Current Query's Affected Rows = $aff_rows, Cumulative Rows = $cumulative_rows<br><br>";
        }
    } while(mysqli_more_results($con) && mysqli_next_result($con));
}

输出:

Current Query's Affected Rows = 1, Cumulative Affected Rows = 1

Selected rows = 1

Current Query's Affected Rows = 1, Cumulative Affected Rows = 2

Selected rows = 2

Current Query's Affected Rows = 2, Cumulative Affected Rows = 4 

对于刚接触数据库查询主题的任何人的重要说明:如果您使用的是用户提供的/外部来源的/不可信的数据,那么您应该使用带有占位符的准备好的语句以实现安全/稳定性(mysqli_multi_query()支持)。使用mysqli_multi_query()似乎是发送一批查询的一种很酷、简洁的方式,但是没有太多令人信服的理由/场景来使用这个功能而不是一次一个地以安全的方式发送查询。

于 2014-03-17T21:25:31.377 回答
0

它实际上会从 MySQL 中获取整个结果集。然后,您可以 mysqli_data_seek() 移动到集合中的特定行。所以这意味着所有结果将在第一次调用后存储在 php 端,后续调用将只从 php 请求结果

于 2013-05-03T09:23:19.403 回答