【发布时间】: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 的工作方式。