结束准备好的陈述

2024-02-02

我知道结束准备好的陈述是建议做的事情 https://stackoverflow.com/questions/6631364/when-to-close-prepared-statement.

但我有一个PHP像这样的脚本:

$sql = "SELECT * FROM `mytable` WHERE ...";
$stmt = $dbh->stmt_init();

if($stmt->prepare($sql))
{
    $stmt->bind_param("s", $user);

    if($stmt->execute())
    {
        $result = $stmt->get_result();
        $stmt->close();
    } else
        header("Location: .?error=unknown");
} else
    header("Location: .?error=conn");

如果一切正常,该语句将关闭,但如果执行期间出现故障,则该语句不会关闭。

我应该写吗

else {
    $stmt->close();
    header("Location: .?error=unknown");
}

and

else {
    $stmt->close();
    header("Location: .?error=conn");
}

或者,由于发生了错误,我不应该担心关闭该语句?

或者我什至可以写:

$sql = "SELECT * FROM `mytable` WHERE ...";
$stmt = $dbh->stmt_init();

if($stmt->prepare($sql))
{
    $stmt->bind_param("s", $user);

    if($stmt->execute())
    {
        $result = $stmt->get_result();
    } else
        header("Location: .?error=unknown");
} else
    header("Location: .?error=conn");

/*some other code*/

$stmt->close; //close every statement at the very end of the script

或者在我使用完准备好的语句后立即关闭它们以避免任何类型的错误是否更好?


您的代码的问题不在于使用close(),但是报错,没有启用。您必须启用mysqli 错误报告 https://stackoverflow.com/a/22662582/1839439然后你就可以简化你的代码。

理想情况下,您的数据库操作应该包装在函数或方法中,然后您无需担心关闭任何内容。它会自动为您关闭。

$sql = "SELECT * FROM `mytable` WHERE ...";
$stmt = $dbh->prepare($sql);
$stmt->bind_param("s", $user);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();

如果您要将其包装在函数中,则无需close().

function getResults(\mysqli $dbh, string $sql, string $types, array $params): array {
    $stmt = $dbh->prepare($sql);
    $stmt->bind_param($types, ...$params);
    $stmt->execute();
    return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
}

然后,如果你有异常,你应该创建一个generic错误处理程序,当发生错误时,它将通过生成 HTTP 500 响应代码将用户重定向到 500 页面,并将所有异常详细信息记录到服务器上的文件中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结束准备好的陈述 的相关文章

随机推荐