我正在将一些代码转换为使用准备好的语句,就像在使用 mysqli
. 当我试图关闭连接时,问题就来了($con
). 无论我怎么尝试,如果我先关闭准备好的语句,我都会得到一个错误($sql
).
错误是。
发生异常,警告 AdminDb::test(): 无法获取mysqli_stmt.
我的猜测是 $sql_>close()
也正在关闭连接,因为所有的 $con
的属性在语句关闭后变成了null。但我到处都能看到关闭语句,然后关闭连接的示例代码。我试过在 try
块,预先声明 $con
和 $sql
,等等,都没有用。
如果我跳过语句close,连接关闭就能正常工作。
下面是一个测试函数来演示这个问题。
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();
}
}
好吧,我认为这实际上是Visual Studio Code、PHP Debug、PHP Server和XDebug的某个地方出了问题,因为如果我删除所有的函数断点,一切都好。
我最终发现,因为我在一些无害的语句上看到了错误,如 return TRUE;
.
诡异,但要注意的是。
更新
Visual Studio Code Debug自带一个默认的 断点 设置为 "Everything"(Debug窗格的左下角)。这似乎会抛出所有的错误和警告,而不是让你的代码处理它们。
取消勾选这个,然后重新加载,你应该就可以了。我在这上面损失了几个小时。