【问题标题】:Problem Closing Connection When Using Prepared Statement [duplicate]使用准备好的语句时关闭连接的问题[重复]
【发布时间】:2020-06-10 04:18:27
【问题描述】:

按照使用mysqli 时的建议,我正在转换一些代码以使用准备好的语句。当我尝试关闭连接($con)时,问题就来了。无论我尝试什么,如果我首先关闭准备好的语句 ($sql),都会出现错误。

错误是:

发生了异常。 警告:AdminDb::test(): 无法获取 mysqli_stmt

我的猜测是$sql_>close() 也在关闭连接,因为$con 的所有属性在语句关闭后都变为空。但是在我看到的任何地方,我都会看到示例代码关闭语句,然后关闭连接。我尝试在try 块内关闭,预先声明$con$sql 等,均无济于事。

如果我跳过语句关闭,连接关闭工作正常。

这是一个演示问题的测试函数。

public function test(): bool {

    try {
        $con = new mysqli(self::$serverName, self::$userName, self::$password, self::$dbName, self::$port);
        if ($con->connect_errno) throw new DatabaseException("Database connection failed: ($con->connect_errno) $con->connect_error");
        $sql = $con->prepare("
            SELECT `Id`
            FROM   `provider`
            WHERE  `HeaderText` = ?");
        $sql->bind_param('s', $headerText);
        $sql->execute();
        $sql->store_result();
        $sql->free_result();
        return TRUE;
    } catch (\Throwable $e) {
        throw $e;
    } finally {
        if (isset($sql)) $sql->close();
        if (isset($con)) $con->close();
    }
}

【问题讨论】:

  • 只是不要关闭它。
  • @YourCommonSense 是的。谢谢。已经知道了。
  • @YourCommonSense 我认为您将这个问题作为重复来结束有点过分了;你说的这个问题是不一样的。另一个是询问练习,我强调一个错误。
  • 公平。我更改了欺骗并将具有更好实践的链接添加到 cmets 而不是 stackoverflow.com/questions/61323391/…
  • 错误信息和条件相同,所以我认为这是一个重复的问题。您可以将您的答案添加到另一个问题,它会在那里引起更多关注。这就是 Stack Overflow 的工作方式。

标签: php mysqli


【解决方案1】:

好吧,我认为这实际上是 Visual Studio Code、PHP Debug、PHP Server 和/或 XDebug 的问题,因为如果我删除所有函数断点,一切都会好起来的。

我最终因为看到诸如return TRUE; 之类的无害语句中的错误而感到不安。

很奇怪,但需要注意。

更新

Visual Studio Code Debug 带有默认的 Breakpoints 设置“Everything”(调试窗格的左下角)。这似乎会抛出所有错误和警告,而不是让您的代码处理它们。

取消勾选并重新加载,你应该没问题。我为此浪费了几个小时。

【讨论】:

  • 什么是 真正 奇怪的是每次执行查询时您都在连接,而不是在您的代码。作为副作用,这会使关闭连接变得毫无意义。
  • 关闭语句也是没有意义的,因为它会在函数执行结束的那一刻自动关闭。这使得使用 try/catch/finally 的整个业务也毫无意义。你真的可以让你的代码少两倍的 WET 和更有意义
  • @YourCommonSense 感谢您的意见,但迟开/早关实际上是数据库连接的“事情”。这与问题无关,因为示例代码只是为了演示问题。
猜你喜欢
  • 2011-10-01
  • 1970-01-01
  • 2016-02-24
  • 2013-10-26
  • 2011-07-13
  • 2014-06-30
  • 1970-01-01
相关资源
最近更新 更多