mysqli_stmt_get_result和mysqli_stmt_store_result有什么区别?

3

在php文档中,它说:

mysqli_stmt_store_result - 从准备好的语句传输结果集。


mysqli_stmt_get_result - 从准备好的语句获取结果集。

我不清楚它们之间的区别,有人可以详细解释一下吗?我看到mysqli_stmt_get_result与mysqli_fetch_assoc一起使用。但我仍然不确定何时使用一个而不是另一个。

谢谢。


重复的问题?https://dev59.com/SVsW5IYBdhLWcg3wT155 - waterloomatt
1
这回答了你的问题吗?在PHP中,get_result()和store_result()有什么区别? - Dharman
1个回答

3

mysqli_stmt_store_result()将结果集中所有记录都传输到PHP内存中。之后“获取”行只是在内存中的结果集上迭代。这很好,除非你的结果集过大; 它可能超出你的PHP内存限制。此函数仅返回TRUE或FALSE。你可以从mysqli对象或语句对象调用它。

mysqli_use_result()不会传输整个结果集,每次提取一行时,它会向MySQL服务器发起单独的调用。这样,你的PHP内存就不必同时容纳整个结果集。你可以处理每一行并将其丢弃。当结果集太大时,这很有用。此函数返回一个mysqli_result资源。你只能从mysqli对象中调用它,不能从语句对象中调用它,因此无法用于预处理语句。

请注意,在客户端(PHP)获取所有行之前,无法获取结果集中的行数。因此,在获取之前尝试读取mysqli_stmt_num_rows()将返回0,即使你知道结果应该包含内容。使用存储结果函数也算作为此目的获取结果集。

mysqli_stmt_get_result()是mysqlnd驱动程序中的较新方法。此函数从预处理语句返回一个mysqli_result资源。这有助于在不使用mysqli_stmt_bind_result()的情况下编写提取循环,某些人认为这很令人困惑。

mysqli_stmt_get_result()始终在内部调用store-result,因此你最好有足够的PHP内存来容纳完整的结果集。鉴于此,我不知道如果使用预处理语句如何进行逐行抓取。你只需要确保不运行具有大型结果集的SQL查询。

老实说,当我使用PHP时,我避免使用mysqli。我更喜欢PDO。它的用法更清晰、更不容易混淆。我希望PHP在停用mysql时就同时停用mysqli。或者至少明确表示PDO是首选。


这个问题从来没有涉及到 mysqli_use_result(),这让我有点困惑。这似乎不是 OP 想要的。 - Dharman
我包含了这个是因为有必要讲述整个故事。如果不将store_result与use_result进行比较,很难解释store_result与get_result的区别。 - Bill Karwin
但如果你感到困惑,有一个更简单的答案:使用PDO。 :-) - Bill Karwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接