首页 > 解决方案 > mysqli_free_result() VS mysqli_stmt_free_result() 区别和用法?

问题描述

这两个功能有什么区别和具体用例?这是我发现的:

mysqli_free_result — 释放与结果相关的内存

mysqli_stmt_free_result — 释放给定语句句柄的存储结果内存

一个例子会很好。

标签: phpmysqli

解决方案


这是两个不同的功能,但您不需要使用它们中的任何一个。

mysqli_free_result

mysqli_free_result()是 的程序等价物$result->free()。它所做的只是取消设置变量的结果。该对象仍然存在,但变得无法使用。

$id = 1;
$stmt = $mysqli->prepare('SELECT * FROM student_detail WHERE ID=?');
$stmt->bind_param('s', $id);
$stmt->execute();
$result = $stmt->get_result();

$result->free();

var_dump($result->fetch_assoc()); // error

它也有 2 个别名。这4个都是一样的:

$result->free();
$result->close();
$result->free_result();
mysqli_free_result($result);

mysqli_stmt_free_result

做同样的事情,但与语句本身。它相当于$stmt->free_result()

$id = 1;
$stmt = $mysqli->prepare('SELECT * FROM student_detail WHERE ID=?');
$stmt->bind_param('s', $id);
$stmt->execute();
$result = $stmt->store_result();

$stmt->free_result();

var_dump($stmt->fetch()); // false

您可以假设,如果您发现自己需要使用其中任何一个,那么这意味着您可能做错了什么。

例如,有些人声称,当您在完成后释放结果时,它会为您的服务器节省内存。实际上,您应该以 mysqli_result 仅在您需要时才存在的方式封装您的数据库查询。看一下我前段时间写的一个方法:

public function safeQuery(string $sql, array $params = []): ?array {
    $stmt = $this->prepare($sql);
    if ($params) {
        $stmt->bind_param(str_repeat("s", count($params)), ...$params);
    }
    $stmt->execute();
    if ($result = $stmt->get_result()) {
        return $result->fetch_all(MYSQLI_BOTH);
    }
    return null;
}

它执行准备好的语句,获取结果,获取记录,只要需要,mysqli_result 就一直存在,而不是片刻。


推荐阅读