为什么在调试过程中 mysqli->$errno 被设置为 0?

Why is the mysqli->$errno being set to 0 in the middle of the debugging?

今天我遇到了一个奇怪的情况。我一直在寻找定义,但不幸的是,我找不到。

在我的 PHP 代码中,我正在向数据库 table 中插入一行。当我尝试插入重复的主键作为调试最近问题的一部分时,我可以按预期在 mysqli 对象中看到重复的主键异常。

但是,mysqli->$errnomysqli->$errormysqli->error_list 立即被重置为空,我无法理解为什么。

这是我遇到问题的部分代码。

$retry = 5;
do {
    $mysqli_result = mysqli_query($conn, $sql);
    if (mysqli_errno($conn) == 1213)    { /** Here I can observe the expected errno, error, error_list **/
        sleep(1); $retry--;
    } else
        $retry = 0;
} while ($retry);
/** Here - errno, error, error_list are reset to empty */

更新 我还注意到,随着我提到的变化,mysqli->$stat 也在发生变化。还是当查询统计信息时,其他所有内容都已重置?

一些附加信息

很抱歉这么说,但看起来问题是您使用的 PHP 版本不受支持。损坏的 mysqli::$stat 属性 在 PHP 7.4 中被移除。解决方案是升级您的 PHP 版本。

当触发任何 MySQLi 函数时,错误和错误属性被重置。调用每个函数后必须立即检查它。

例如:

$mysqli->stat();
if($mysqli->error) {
  // ...

但是,我强烈建议忘记使用 errorerrno 属性。只需启用自动 MySQLi 错误报告并停止手动检查错误。

使用 xDebug 时,由于这个 MySQLi 错误,属性永远不会正确显示给您。

我知道你现在负担不起,但请始终考虑使用 PDO 而不是 MySQLi。 PDO 更好更容易。