mysqli_query 和 mysqli_real_query 之间的区别
Posted
技术标签:
【中文标题】mysqli_query 和 mysqli_real_query 之间的区别【英文标题】:difference between mysqli_query and mysqli_real_query 【发布时间】:2012-11-08 07:27:18 【问题描述】:mysqli::query
和 mysqli::real_query
有什么区别?
或
mysqli_query
和 mysqli_real_query
有什么区别?
【问题讨论】:
不知道为什么这个问题被关闭了。它可能应该由手册回答,但那里不是很清楚,“不具建设性”的接近理由的文字似乎根本不适合它。 是的,这绝对不应该被关闭,尤其是列出的关闭它的原因。我只是为了这个确切的问题来到这里,很高兴我做到了。版主需要认真地停止在帖子上看到“关闭”链接时点击高兴。 @SazzadHossainKhan 我已经这样做了,但是当它被其他用户(there's a report here, but you can probably only see it with a high-rep account)审查时,显然以 3 比 2 的票数被击败。我不认为马歇尔公爵有资格投这样的票。 我还要求重新打开这个问题。我相信这个问题是完全有效的,而且格式正确。我来这里之前查看了 php 手册,也被解释所困扰。现在我明白了,在我正在查看的(未记录的)代码中,$mySQLi->real_query() 函数的错误检查测试失败的 SQL 命令,而 separate $mySQLi->store_result() 函数测试非空结果集。 【参考方案1】:mysqli::query
将返回一个结果,如果有的话。
mysql::real_query
成功时返回 true,否则返回 false
你可以在 php 文档中看到这个:
query, real_query。【讨论】:
通过描述你为什么不赞成它来帮助我写出更好的答案【参考方案2】:查看mysqli_query()的文档:
在功能上,使用这个函数和调用是一样的 mysqli_real_query() 后跟 mysqli_use_result() 或 mysqli_store_result()。
据我了解,real_query 实际执行查询,而 use/store_result 启动检索查询结果集的过程。 query() 两者都做。
【讨论】:
文档现在有所不同:“对于非 DML 查询(不是 INSERT、UPDATE 或 DELETE),此函数类似于调用 mysqli_real_query () 后跟 mysqli_use_result() 或 mysqli_store_result()。”【参考方案3】:有点晚了,但对我来说最大的进步是使用默认设置调用这些函数时的 RAM 使用情况:使用 mysqli_real_query()
您不会将整个结果复制到 RAM 中,mysqli_query()
默认情况下会这样做(尽管它可以使用$resultmode
参数进行更改)。
【讨论】:
你可以和mysqli_query()一样,只是告诉它进行无缓冲调用【参考方案4】:实际上,我在其他答案中看不到另一个区别。 您可能需要将mysqli_real_query()
用于CALL
声明。
如果您正在调用存储过程,则它可以返回多个结果。 mysqli_query()
将获取第一个结果,但可能需要获取更多结果,这会导致错误。您需要使用mysqli_real_query
(或mysqli_multi_query()
)来获取这些结果集。
遗憾的是,解释在stored procedures section of the PHP docs,所以很难找到。
我给你一个代码示例,以防万一,调用一个假设使用mysqli::real_query
返回多个结果集的过程:
$query="CALL storedProcedure()";
if($conn->real_query($query))
do
if($result=$conn->store_result())
while($row=$result->fetch_assoc())
print_r($row);
$result->free();
while($conn->more_results() && $conn->next_result());
【讨论】:
您也可以使用 mysqli_query() 查询来做到这一点。检查您的场所 @YourCommonSense Manual 明确指出:“从存储过程返回的结果集无法使用 mysqli_query() 正确获取。mysqli_query() 函数结合了语句执行和获取第一个将结果集放入缓冲的结果集(如果有)。但是,还有其他对用户隐藏的存储过程结果集,导致 mysqli_query() 无法返回用户预期的结果集。" 好吧,手册是错误的。只需使用 next_result() 和 store_result() 调用通常的例程,并获得这些额外的结果集 @YourCommonSense 几年前我很难学会它,不得不更改我的代码,但也许新版本的 PHP 允许它。听起来很少手册是错误的,但并非不可能。如果可以的话会尝试一下,从官方文档中提取的建议似乎是公平的。 这只是一个小的算法不便,而不是一些固有的特性。您只是不要在第一遍时调用 store_result() ,仅此而已。在您的循环中,您可以将其移动到 while 子句中,然后您可以将 real_query 更改为 query() 没有任何问题。基本上,您使用的函数与存储过程无关。以上是关于mysqli_query 和 mysqli_real_query 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
mysqli_query 的用法和my_sqliconnect的用法