我一直在阅读mysqli_store_result
,我不明白为什么这是选择加入,而不是选择退出。根据手册,我不应该将它用于内存重大操作,但鉴于我一次只能获取50-100行文本(通常),我得出的结论是我应该总是使用它,但我必须明确为每个查询调用它。这对我来说似乎很奇怪。我这样说是因为它向我表明我误解了一些东西。
据我了解;如果您读取100行并使用while ($stmt->fetch())
,则实际上是通过网络向MySQL发送了100个读取下一个请求(假设Web和DB位于不同的计算机上)。如果您使用mysqli_store_result
,则只发送一个请求并在Web服务器上循环结果集。为什么我不总是这样做?我错过了什么?
还有一个子问题:这是否与我的MySQL状态变量有关"处理程序读取下一个"非常高,会对store_result有帮助吗?
答案 0 :(得分:1)
为什么这是选择加入而不是选择退出。
好吧,我可以尝试回答(或者至少推测)为什么就是这样。
与大多数PHP一样,Mysqli只是一个比C函数更薄的包装器。这么薄,它不会自己添加任何东西。反过来,底层的C API只提供基本功能,在实现上留下了所有改进。由于您无法“撤消”在客户端获取结果集,因此默认情况下这是一个选择加入似乎是合乎逻辑的。有趣的是,为什么mysqli_query()
默认情况下启用缓冲模式,但是对于准备/执行它不是。
但我必须为每一个查询显式调用它。
来吧!它是你必须为每个查询调用唯一的东西吗?那么调用 bind_param,bind_result,execute()?你知道,mysqli就是调用最基本的API函数。因此,在某种程度上,调用store_result()
是相当合乎逻辑的。
考虑到所有这些,我认为你可以得出的唯一结论是你应该在mysqli之上编写你的包装器,或者你可以使用PDO,它确实是一个包装器,几乎所有必需的功能都已经实现
答案 1 :(得分:-1)
实际上,您可能或可能不会发出“100个请求”。 PHP正在与MySQL接口层进行通信,后者又与数据库进行通信。 (但是你可以观察流量,比如说使用“WireShark”或其他同样出色的TCP / IP嗅探工具......)
然而,话说回来之后,我遇到了一些“坦率,非常奇怪”的特点......就是将整个结果集取回一个数组,然后关闭语句句柄。我的逻辑然后从该数组中派出行。 “少吃,味道好。”
我有{问题 ...与chart.pathToImages = "https://www.amcharts.com/lib/3/images/";
,我从未完全弄明白。因此我放弃了它,找到了做工作的同样令人满意的方式(即:“将它存储到PHP数组......”),并继续前进。