我知道结束语是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
还是在使用完准备好的语句后立即关闭它们以避免任何错误更好?
2条答案
按热度按时间wooyq4lh1#
代码的问题不在于
close()
的使用,而在于错误报告,它没有启用。您必须启用mysqli error reporting,然后才能简化代码。理想情况下,数据库操作应该 Package 在函数或方法中,这样就不需要担心关闭任何东西。它将自动为您关闭。
如果你想把它 Package 在一个函数中,那么就不需要
close()
了。然后,如果你有一个异常,你应该创建一个通用错误处理程序,当错误发生时,它将通过生成HTTP 500响应代码将用户重定向到500页面,并将所有异常细节记录到服务器上的一个文件中。
o7jaxewo2#
别关门
不管另一个答案(10年前写的)说什么,作为一项规则,你不关闭一个准备好的声明。只是没必要当前作用域关闭时,会自动关闭。这意味着即使在脚本执行过程中,您也不必关心关闭语句,更不用说完全完成PHP脚本了-在这种情况下,整个数据库连接将自动关闭,并且它也将释放所有相关的资源。
顺便说一句,您编写的代码几乎是运行简单查询所需代码的五倍。以下是它应该如何做,整洁和简洁:
问题是,你的数据库代码永远不应该报告它的错误。你的代码应该有一个独特的部分在其他地方,这将照顾所有的错误。
不,在应用程序错误的情况下进行HTTP重定向不是正确的方法。你的应用程序应该返回一个正确的HTTP代码(5xx)来告诉客户端有问题。