在关闭预准备语句之前在函数中返回值 - 内存泄漏?

Returning Value in Function before closing prepared statement - Memory leak?

提问人:deployHuman 提问时间:6/23/2020 最后编辑:DharmandeployHuman 更新时间:6/23/2020 访问量:38

问:

我想确保我没有一些内存泄漏和不良的编码习惯。我可能只是在这里回答自己。

这是我的一个典型功能,我应该在所有返回情况下绑定一个$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 ?
}
php 函数 mysqli 返回

评论

0赞 Dharman 6/23/2020
您需要停止手动检查错误。请阅读:我们是否应该手动检查mysqli_connect()错误? 和我应该在调用“mysqli_stmt_prepare”时手动检查错误吗?
0赞 Dharman 6/23/2020
$stmt->num_rows == 0那里根本不需要

答:

0赞 Dharman 6/23/2020 #1

您的问题的一个简单答案是,这是一个局部变量,因此PHP将在函数执行结束后立即将其全部清理并收集垃圾。您无需致电 或 .$stmtfree_resultclose

更长的答案是你从错误的角度来解决这个问题。您不应创建这样的特定函数。您必须有一个泛型函数。例如。

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