热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么我们关闭Mysqli-WhydowecloseresultinMysqli

Whyareweclosingthe$result为什么我们要关闭$result$mysqlinewmysqli(localhost,root,root

Why are we closing the $result

为什么我们要关闭$result

    $mysqli = new mysqli("localhost", "root", "root", "test");
    if ($mysqli->connect_errno) {
        echo "Failed to connect to MySQL: " . $mysqli->connect_error;
    }

    if ($result = $mysqli->query("Select * from user")) {
        while ($row = $result->fetch_object())
        {
            //var_dump($row);
        }
        $result->close();
    }   

1 个解决方案

#1


4  

Your check if the connection failed falls through to the code that uses the connection. Obviously that won't work because it's not a live connection. Make sure that if the connection fails, code that depends on it is not reached. (Note that I'm not necessary advocating use of exit or die. They can make for a rather bad user experience. They can be useful, but ideally you should output a better message and leave the ugly error stuff for logs [unless you're only testing or it's a command line script]).

如果连接失败,您将检查使用该连接的代码。很明显,这不会起作用,因为它不是一个实时连接。确保如果连接失败,则不会访问依赖于它的代码。请注意,我并不需要提倡使用退出或死亡。它们会造成相当糟糕的用户体验。它们可能是有用的,但理想情况下,您应该输出更好的消息,并为日志留下难看的错误信息(除非您只是在测试或它是一个命令行脚本)。

As for close() (which is actually an alias for free()):

至于close()(实际上是free()的别名):

free() basically deallocates all of the stuff attached to result. You need to understand that there are two (simplification, but go with it) ways of retrieving rows:

free()基本上处理与结果相关的所有内容。您需要理解有两种方式(简化,但随它去)检索行:

Buffered - Everything is snatched in one go. In other words, by the time you start looping through the records, they're all actually already in memory. They are buffered. They are not being pulled from the server every time you call fetch() but rather are being pulled from memory.

缓冲-所有东西都一次被抓取。换句话说,当你开始循环遍历记录时,它们实际上都已经在内存中了。他们是缓冲。它们不会在每次调用fetch()时从服务器中提取,而是从内存中提取。

Non buffered - there may be a small buffer, but essentially every time you call fetch(), PHP must pull a new row from the database. At the beginning of the loop, they are not all sitting in memory.

非缓冲—可能有一个小的缓冲区,但实际上每次调用fetch()时,PHP必须从数据库中提取一个新行。在循环的开始,它们并不都在内存中。

Interesting note: num_rows() can be called on a buffered query very efficiently since all of the rows are already pulled (though you should never pull all of the rows just to count them -- that's what COUNT is for). Non buffered queries cannot do num_rows() until they pull all of the rows. Meaning it will either be an error, or will essentially turn it into a buffered query.

有趣的注释:num_rows()可以非常有效地调用一个缓冲查询,因为所有的行都已经被拉了(尽管您不应该把所有的行都拉到一起来计算它们——这就是count的作用)。非缓冲查询不能执行num_rows(),直到它们拉出所有的行。这意味着它要么是一个错误,要么本质上将它转换为缓冲查询。

Anyway, back to your actual question:

不管怎样,回到你真正的问题:

free() frees anything associated with the result object. In the case of a buffered query, this is any rows sitting in memory. In the case of a non buffered query, free() will release whatever rows may be sitting in memory and then cancel the rest of the request. Basically its PHP telling MySQL, "Hey you know all those rows I request? Changed my mind. You can just drop that request."

free()释放与结果对象关联的任何内容。对于缓冲查询,这是内存中的任何行。对于非缓冲查询,free()将释放内存中可能存在的任何行,然后取消请求的其余部分。它的PHP告诉MySQL,嘿,你知道我请求的所有行吗?改变了我的想法。你可以放弃这个请求。

As for if you should free results... Well, whenever the variable goes out of scope*, it will happen anyway. There is, however, no harm in explicitly doing it, and in situations where a query may use a lot of memory and then another query after it may use a lot of memory, you may wish to free the sets just to keep memory usage low.

至于你是否应该得到免费的结果……当变量超出范围*时,它就会发生。然而,显式地这样做并没有什么害处,而且在查询可能使用大量内存,然后在查询可能使用大量内存之后再使用另一个查询的情况下,您可能希望释放这些集,以保持低内存使用率。

* Or maybe when the request ends. I don't remember off the top of my head.

*或者当请求结束时。我一时想不起来了。


推荐阅读
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • MyBatis入门指南:环境搭建与基础配置详解
    本文详细介绍了MyBatis的基础配置流程,包括在Maven项目中添加MyBatis依赖、IDEA中配置数据库连接、导入SQL脚本以及编写mybatis-config.xml配置文件等关键步骤。 ... [详细]
  • 本文介绍如何通过创建数据库触发器来限制Oracle数据库中特定用户的登录IP地址,以增强系统的安全性。示例代码展示了如何阻止非授权IP地址的登录尝试。 ... [详细]
  • 本文详细介绍了如何在Windows和Linux系统上配置Openfire服务器,包括安装步骤、数据库配置及端口映射等关键环节。 ... [详细]
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 本文详细介绍了如何使用Linux下的mysqlshow命令来查询MySQL数据库的相关信息,包括数据库、表以及字段的详情。通过本文的学习,读者可以掌握mysqlshow命令的基本语法及其常用选项。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • Java连接MySQL数据库的方法及测试示例
    本文详细介绍了如何安装MySQL数据库,并通过Java编程语言实现与MySQL数据库的连接,包括环境搭建、数据库创建以及简单的查询操作。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • SQL 数据恢复技巧:利用快照实现高效恢复
    本文详细介绍了如何在 SQL 中通过数据库快照实现数据恢复,包括快照的创建、使用及恢复过程,旨在帮助读者深入了解这一技术并有效应用于实际场景。 ... [详细]
  • 构建Python自助式数据查询系统
    在现代数据密集型环境中,业务团队频繁需要从数据库中提取特定信息。为了提高效率并减少IT部门的工作负担,本文探讨了一种利用Python语言实现的自助数据查询工具的设计与实现。 ... [详细]
  • iOS 小组件开发指南
    本文详细介绍了iOS小部件(Widget)的开发流程,从环境搭建、证书配置到业务逻辑实现,提供了一系列实用的技术指导与代码示例。 ... [详细]
  • 本文提供了一个SQL脚本,用于在Microsoft SQL Server中创建一个数据字典视图,该视图详细列出了表名、表描述、字段名称、字段描述、字段类型、字段大小、字段精度、是否可为空、默认值以及是否为标识或主键等信息。 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 在AngularJS中,有时需要在表单内包含某些控件,但又不希望这些控件导致表单变为脏状态。例如,当用户对表单进行修改后,表单的$dirty属性将变为true,触发保存对话框。然而,对于一些导航或辅助功能控件,我们可能并不希望它们触发这种行为。 ... [详细]
author-avatar
手机用户2602889563
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有