首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试关闭MySQLi连接...抓住..。finally块

问尝试关闭MySQLi连接...抓住..。finally块
EN

Stack Overflow用户
提问于 2017-02-05 02:56:01
回答 1查看 783关注 0票数 2

关闭try... catch... finally块中的MySQLi连接的最佳方法是什么?

这似乎在总体上是可行的,但是当它在第一个if语句(Warning: mysqli::close(): Couldn't fetch mysqli in /path-to-file/ on line 33)上失败时会给出一个错误

代码如下:

代码语言:javascript
复制
<?php
    session_start();

    if (isset($_POST["login-submit"])) {
        require("db-config.php");

        try {
            $mysqli = @new mysqli($dbHost, $dbUser, $dbPass, $dbName);
            if ($mysqli->connect_error) {
                throw new Exception("Cannot connect to the database: ".$mysqli->connect_errno);
            }

            $username = $_POST["login-username"];
            $password = $_POST["login-password"];

            if (!($stmt = @$mysqli->prepare("SELECT * FROM users WHERE username = ?"))) {
                throw new Exception("Database error: ".$mysqli->errno);
            }

            if (!@$stmt->bind_param("ss", $username)) {
                throw new Exception("Bind error: ".$mysqli->errno);
            }

            if (!@$stmt->execute()) {
                throw new Exception("Execution error: ".$mysqli->error);
            }

        } catch (Exception $exception) {
            $error = $exception->getMessage();
            echo $error; #for debugging

        } finally {
            if ($mysqli != null) $mysqli->close();
            if ($stmt != null) $stmt->close();
        }
    }
?>
EN

回答 1

Stack Overflow用户

发布于 2020-06-21 05:14:13

根本不要关闭它!在脚本末尾手动关闭连接是没有意义的。一旦脚本被执行,连接将自动关闭,如果它曾经打开过。您的代码还存在其他问题。

try-catch在您的代码中没有实际用途。去掉它就行了。此外,仅仅为了手动抛出异常而使mysqli错误静默是没有意义的。您根本没有增加任何价值,相反,您只是在创建混乱的代码。

修复后的示例应该如下所示:

代码语言:javascript
复制
<?php

session_start();

if (isset($_POST["login-submit"])) {
    require "db-config.php";

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
    $mysqli->set_charset('utf8mb4');

    $username = $_POST["login-username"];
    $password = $_POST["login-password"];

    $stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?");
    $stmt->bind_param("s", $username);
    $stmt->execute();
}

通过切换自动错误报告,您可以确保在发生错误时抛出异常。异常就像是一个错误,它会停止你的脚本。当脚本执行停止时,PHP将进行清理并关闭连接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42044279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档