mysqli_store_result()实际上做了什么?

时间:2013-05-03 09:20:48

标签: php mysqli mysqli-multi-query

我想了解 mysqli_store_result 实际上有什么用?当我访问mysqli_store_result的{​​{3}}时,我找到了定义

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)之后或mysqli_next_result($connection)之后使用此mysqli_querymysqli_multi_query因为我已在PHP Manaul中读过

  

“尽管释放使用的内存总是好的做法   使用mysqli_free_result()函数的查询结果,何时   使用mysqli_store_result()传递大型结果集   变得特别重要。“

来源:PHP Manual

还有一个问题当我执行上面提到的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流程是否会影响性能?

2 个答案:

答案 0 :(得分:6)

之前的评论已经声明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()似乎是一种很酷,简洁的方式来发送一批查询,但使用此功能并不是很多令人信服的理由/场景,而不是以安全的方式一次一个地发送查询。

答案 1 :(得分:0)

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