php - mysqli_free_result() VS mysqli_stmt_free_result() 区别和用法?
问题描述
这两个功能有什么区别和具体用例?这是我发现的:
mysqli_free_result — 释放与结果相关的内存
mysqli_stmt_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 就一直存在,而不是片刻。
推荐阅读
- sql - 如何获得字符串特定部分的最大值?
- php - Running php files with xampp
- ios - Swift - GoogleMaps SDK 获得单指或双指点击手势
- regex - How to decode hex to negative integer value in Perl
- laravel - 找不到模块 vue-swal 的声明文件
- android - 使用 Glide 库构建 gradle 失败后,我的清单丢失了
- java - Java - 迭代 arrayList 并将 250k 单词插入到 treeMap 需要大量时间
- python - 在 matplotlib 中,我可以将标签设置在绘图的底部但刻度线为零吗?
- sql-server - 在 ASP.NET MVC 中,只有特定数据的首字母才会保存在数据库中
- javascript - 无法使用 highlight.js 以正确的顺序呈现 XML