php 闭幕发言

8ljdwjyq  于 2023-10-15  发布在  PHP
关注(0)|答案(2)|浏览(78)

我知道结束语是a suggested thing to do
但是我有一个像这样的 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");
}

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

还是在使用完准备好的语句后立即关闭它们以避免任何错误更好?

wooyq4lh

wooyq4lh1#

代码的问题不在于close()的使用,而在于错误报告,它没有启用。您必须启用mysqli error reporting,然后才能简化代码。
理想情况下,数据库操作应该 Package 在函数或方法中,这样就不需要担心关闭任何东西。它将自动为您关闭。

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

如果你想把它 Package 在一个函数中,那么就不需要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);
}

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

o7jaxewo

o7jaxewo2#

别关门
不管另一个答案(10年前写的)说什么,作为一项规则,你不关闭一个准备好的声明。只是没必要当前作用域关闭时,会自动关闭。这意味着即使在脚本执行过程中,您也不必关心关闭语句,更不用说完全完成PHP脚本了-在这种情况下,整个数据库连接将自动关闭,并且它也将释放所有相关的资源。
顺便说一句,您编写的代码几乎是运行简单查询所需代码的五倍。以下是它应该如何做,整洁和简洁:

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

问题是,你的数据库代码永远不应该报告它的错误。你的代码应该有一个独特的部分在其他地方,这将照顾所有的错误。
不,在应用程序错误的情况下进行HTTP重定向不是正确的方法。你的应用程序应该返回一个正确的HTTP代码(5xx)来告诉客户端有问题。

相关问题