Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么我们要关闭Mysqli_Php_Mysql_Mysqli - Fatal编程技术网

Php 为什么我们要关闭Mysqli

Php 为什么我们要关闭Mysqli,php,mysql,mysqli,Php,Mysql,Mysqli,为什么我们要关闭$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 use

为什么我们要关闭$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();
    }   

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

至于close实际上是免费的别名:

free基本上释放了结果附带的所有内容。您需要了解有两种简化方法,但请使用以下方法检索行:

缓冲-所有东西都可以一次性抓取。换句话说,当你开始循环浏览这些记录时,它们实际上已经在内存中了。它们是缓冲的。它们不是每次调用fetch时都从服务器中提取,而是从内存中提取

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

有趣的注意:在缓冲查询中可以非常有效地调用num_行,因为所有的行都已经被拉入,尽管您不应该拉入所有的行只是为了对它们进行计数——这就是计数的意义。非缓冲查询在提取所有行之前无法执行num_行。这意味着它要么是一个错误,要么本质上将它转换为一个缓冲查询

无论如何,回到你的实际问题:

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

至于你是否应该免费的结果。。。无论何时变量超出作用域*,它都会发生。但是,显式地这样做并没有什么害处,在一个查询可能会占用大量内存,然后在它之后的另一个查询可能会占用大量内存的情况下,您可能希望释放集合以保持内存使用率较低


*或者当请求结束时。我记不得了。

我已经很久没有使用MySQLi了,但似乎query返回布尔值或MySQLi_结果对象。而且mysqli_结果似乎没有一个封闭的方法?你的意思是免费吗?参见示例啊,没有列出它,但是免费页面以别名的形式列出关闭。下面是答案。有没有一个具体的原因让你仍然使用MySQLi,而不是像PDO这样更现代的东西?gud问题,但是MySQLi比PDO快,你只需要使用->关闭select语句就可以了,对吗?而不是像insert或update这样的东西,因为它们不会返回任何东西?@AndyLobel我相信你是对的。我不是肯定的,但是因为没有insert/update/etc的结果集,所以不应该有任何东西可以释放。