mysqli_free_result() VS mysqli_stmt_free_result()的区别和用法?

mysqli_free_result () VS mysqli_stmt_free_result() differences and usage?

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

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

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

举个例子就好了。

它们是等价的,这取决于您最初是如何创建结果的。

如果您使用预准备语句然后使用 $stmt->store_result(),您将使用 $stmt->free_result().

释放结果

如果您执行像 $result = $conn->query(...) 这样的普通查询,您将使用 $result->free_result() 释放它。

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

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 就会一直存在,不会再多了。