我想了解 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_query
和mysqli_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
流程是否会影响性能?
答案 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请求结果