Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 最后准备的发言_Php_Mysqli_Header_Prepared Statement - Fatal编程技术网

Php 最后准备的发言

Php 最后准备的发言,php,mysqli,header,prepared-statement,Php,Mysqli,Header,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();

我知道,准备好的结案陈述很重要

但我有这样一个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");
}

或者,既然发生了错误,我就不必担心关闭语句了

或者我甚至可以写:

$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()
,而是错误报告,它没有启用。必须启用,然后才能简化代码

理想情况下,DB操作应该封装在函数或方法中,这样就不必担心关闭任何东西。它将自动为您关闭

$sql = "SELECT * FROM `mytable` WHERE ...";
$stmt = $dbh->prepare($sql);
$stmt->bind_param("s", $user);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();
如果要将其包装到函数中,则无需使用
close()

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

不要关上它

不管另一个答案(10年前写的)怎么说,作为一项规则,你不能关闭一份准备好的声明。只是没必要。当当前作用域关闭时,它将自动关闭。这意味着即使在脚本执行过程中,您也不关心关闭语句,更不用说完全完成PHP脚本了—在这种情况下,整个数据库连接将自动关闭,也将释放所有相关资源

另一方面,运行一个简单查询所需的代码几乎是它所需代码的五倍。以下是如何做到整洁、简洁:

$sql = "SELECT * FROM `mytable` WHERE ...";
$stmt->prepare($sql);
$stmt->bind_param("s", $user);
$stmt->execute();
$result = $stmt->get_result();
问题是,您的数据库代码永远不应该报告其错误。您的代码应该在其他地方有一个独特的部分,可以处理所有错误


不,在出现应用程序错误的情况下执行HTTP重定向不是一个好办法。您的应用程序应该只返回一个正确的HTTP代码(5xx)来告诉客户端有问题

PHP有一个垃圾收集,它将在脚本结束时被释放。但当您不再需要它时,应该将其关闭;在每次头调用之后,停止对脚本的处理。@JayBlanchard我知道,它只是一个@MarkusZeller,所以我应该选择第二个选项吗?(每次重定向前都关闭)我当然更喜欢这样。但如前所述,PHP将在退出时自行清理。谢谢。。。该函数是否实现垃圾收集(包括
$stmt->close())
当它返回值时?mysqli_stmt将在所有对它的引用都消失后调用析构函数。当您将变量限制在函数范围内时,您将确保对象只在您需要时才存在。PHP随后将清理所有对象。即使它没有,也几乎没有任何理由自己关闭语句。当脚本执行时结束所有对象都将消失。我从不使用
close()
任何代码中的我自己。@Foxel是从函数返回$stmt的唯一例外。在这种情况下,它不会closed@YourCommonSense根据Dharman所说的,在您退出函数的作用域之后,PHP会对其中的所有内容应用垃圾收集…所以我认为即使我从A.function@Foxel当然,这不是问题。如果返回,它就不会关闭-是的,这是正确的做法。还可以设置异常处理程序。您可以在我的
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);
}
$sql = "SELECT * FROM `mytable` WHERE ...";
$stmt->prepare($sql);
$stmt->bind_param("s", $user);
$stmt->execute();
$result = $stmt->get_result();