提问人:deployHuman 提问时间:6/23/2020 最后编辑:DharmandeployHuman 更新时间:6/23/2020 访问量:38
在关闭预准备语句之前在函数中返回值 - 内存泄漏?
Returning Value in Function before closing prepared statement - Memory leak?
问:
我想确保我没有一些内存泄漏和不良的编码习惯。我可能只是在这里回答自己。
这是我的一个典型功能,我应该在所有返回情况下绑定一个$temp,然后在最后返回它还是这样可以?
define DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE
$db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
function Resolvestuff($input) {
global $db;
if ($stmt = $db->prepare("Select Column from Table where `a` = ?")) {
$stmt->bind_param('s', $input);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($col1);
$row = $stmt->fetch();
if ($stmt->num_rows == 0) {
return "Nothing";
} else {
return $col1;
}
$stmt->free_result(); // i mean, is this even performed at some point ?
$stmt->close();
} else {
return "Nothing";
}
//Return here instead ?
}
答:
0赞
Dharman
6/23/2020
#1
您的问题的一个简单答案是,这是一个局部变量,因此PHP将在函数执行结束后立即将其全部清理并收集垃圾。您无需致电 或 .$stmt
free_result
close
更长的答案是你从错误的角度来解决这个问题。您不应创建这样的特定函数。您必须有一个泛型函数。例如。
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
$mysqli->set_charset('utf8mb4'); // always set the charset
function fetchSingle(mysqli $db, string $sql, array $params = []) {
$stmt = $db->prepare($sql);
if ($params) {
$stmt->bind_param(str_repeat("s", count($params)), ...$params);
}
$stmt->execute();
$stmt->bind_result($col1);
$stmt->fetch();
return $col1;
}
$val = fetchSingle($mysqli, "Select Column from Table where `a` = ?", [$input]);
评论
0赞
deployHuman
6/23/2020
哇,从来没这么想过,我真的能看到如此广泛使用的功能的潜力!但话又说回来,我会遇到必然会在我的站点中重复的 Select 语句,因此以预制函数的形式进行简化是有意义的,不是吗?
0赞
Dharman
6/23/2020
不。SQL本身就是一行代码。在函数中换行不是很有用,除非您还有其他功能要封装。这里的关键是,mysqli 函数不应在整个代码中使用。它们必须封装在抽象层中。mysqli 很难使用,如果可以的话,您应该改用 PDO。如果你想使用mysqli,你需要编写这样的函数来帮助你做一些简单的事情。这是另一个很好的例子 phpdelusions.net/mysqli/simple
评论
$stmt->num_rows == 0
那里根本不需要