【问题标题】:Returning Value in Function before closing prepared statement - Memory leak?在关闭准备好的语句之前在函数中返回值 - 内存泄漏?
【发布时间】:2020-10-13 09:53:50
【问题描述】:

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

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


【解决方案1】:

您的问题的一个简单答案是$stmt 是一个局部变量,因此 PHP 将在函数执行结束后立即清理它并收集垃圾。您无需致电free_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]);

【讨论】:

  • 哇,从来没想过,我真的看到了这种广泛使用功能的潜力!但是话又说回来,我会遇到一定会在我的站点中重复的 Select Statements,因此简化预制函数的形状是有意义的,不是吗?
  • 没有。 SQL 本身就是一行代码。在函数中包装一行并不是很有用,除非您也有其他一些功能要封装。这里的关键是不应在整个代码中使用 mysqli 函数。它们必须封装在抽象层中。 mysqli 很难使用,如果可以的话,你应该使用 PDO。如果你想使用 mysqli,你需要编写这样的函数来帮助你做一些简单的事情。这是另一个很好的例子phpdelusions.net/mysqli/simple
猜你喜欢
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多