mysqli_store_result() 与 mysqli_use_result()问题故事

2022-08-30 12:56:09

问题

mysqli::store_result()mysqli::use_result() 有什么区别?

故事

模糊的文档

关于 PHP.net 的文档似乎对两者之间的区别非常模糊。mysqli::use_result()-page不提供任何代码示例,并将您链接到mysqli::multi_query()-page以查找它们。在该页中,给出了以下代码示例(有关完整代码,请参阅该页):

/* store first result set */
if ($result = $mysqli->store_result()) {
    while ($row = $result->fetch_row()) {
        printf("%s\n", $row[0]);
    }
    $result->free();
}
/* print divider */
if ($mysqli->more_results()) {
    printf("-----------------\n");
}

mysqli::store_result()-page 使用完全相同的代码示例,但有一个例外:

/* store first result set */
if ($result = $mysqli->use_result()) {

是的。。。 成为。请注意,即使上面的评论仍然在说“商店”。store_resultuse_result

更令人困惑

看过代码示例后,我想;“好吧,所以这是一个别名”。但是等等!该文档给出了以下说明:

它们看起来像是两个不同的东西,根本不像别名一样。仔细观察,我发现在mysqli::use_result()-page:的代码示例中还有另一个异常:变成了。然而,我找出真相的希望很快就破灭了,当我发现在第二个代码示例(过程等效物)的同一页面上,使用了,而不是预期的 。$result->free();$result->close();mysqli_free_result($result);mysqli_close_result($result);


答案 1

mysqli::store_result()将从MySQL服务器获取整个结果集,同时逐个获取行。mysqli::use_result()

您链接到的文档也提到了这一点:mysqli::use_result

mysqli_use_result() 函数不会从数据库中传输整个结果集,因此不能使用mysqli_data_seek() 等函数移动到集合中的特定行。若要使用此功能,必须使用 mysqli_store_result() 存储结果集。如果在客户端执行大量处理,则不应使用mysqli_use_result(),因为这会占用服务器并阻止其他线程更新从中获取数据的任何表。

通常,除非您有充分的理由不一次从服务器读取所有行,否则通常可以使用。mysqli::store_result()


答案 2

use_result返回未缓冲的结果。

store_result返回缓冲结果。


推荐