gpt4 book ai didi

php - mysqli_store_result() 实际上做了什么?

转载 作者:可可西里 更新时间:2023-11-01 12:54:21 26 4
gpt4 key购买 nike

我想了解什么 mysqli_store_result 实际上呢?当我访问 PHP Manualmysqli_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) 吗?和 mysqli_next_result($connection)在每个 mysqli_query 之后或者在 mysqli_multi_query 之后因为我在 PHP Manaul 中读到过

"Although it is always good practice to free the memory used by the result of a query using the mysqli_free_result() function, when transferring large result sets using the mysqli_store_result() this becomes particularly important."

来源: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工艺会影响性能吗?

最佳答案

以前的评论指出 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() 似乎是发送一批查询的一种很酷、简洁的方法,但是没有太多令人信服的理由/场景来使用此函数而不是一次发送一个查询安全的方式。

关于php - mysqli_store_result() 实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16355501/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com