为什么在调试过程中 mysqli->$errno 被设置为 0?
Why is the mysqli->$errno being set to 0 in the middle of the debugging?
今天我遇到了一个奇怪的情况。我一直在寻找定义,但不幸的是,我找不到。
在我的 PHP 代码中,我正在向数据库 table 中插入一行。当我尝试插入重复的主键作为调试最近问题的一部分时,我可以按预期在 mysqli
对象中看到重复的主键异常。
但是,mysqli->$errno
、mysqli->$error
、mysqli->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 5.6 [95% 兼容 PHP 7.2] 的旧项目。所以我在本地环境中使用 7.2。请不要建议我升级整个项目,我知道它已经死了。我只是在维护项目
- 变量
$conn
是全局变量
- 我正在使用 vscode 和兼容的 Xdebug 扩展来观察变量
- 我在跨过当前语句时出现轻微延迟时观察到了这种行为。
很抱歉这么说,但看起来问题是您使用的 PHP 版本不受支持。损坏的 mysqli::$stat
属性 在 PHP 7.4 中被移除。解决方案是升级您的 PHP 版本。
当触发任何 MySQLi 函数时,错误和错误属性被重置。调用每个函数后必须立即检查它。
例如:
$mysqli->stat();
if($mysqli->error) {
// ...
但是,我强烈建议忘记使用 error
和 errno
属性。只需启用自动 MySQLi 错误报告并停止手动检查错误。
使用 xDebug 时,由于这个 MySQLi 错误,属性永远不会正确显示给您。
我知道你现在负担不起,但请始终考虑使用 PDO 而不是 MySQLi。 PDO 更好更容易。
今天我遇到了一个奇怪的情况。我一直在寻找定义,但不幸的是,我找不到。
在我的 PHP 代码中,我正在向数据库 table 中插入一行。当我尝试插入重复的主键作为调试最近问题的一部分时,我可以按预期在 mysqli
对象中看到重复的主键异常。
但是,mysqli->$errno
、mysqli->$error
、mysqli->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 5.6 [95% 兼容 PHP 7.2] 的旧项目。所以我在本地环境中使用 7.2。请不要建议我升级整个项目,我知道它已经死了。我只是在维护项目
- 变量
$conn
是全局变量 - 我正在使用 vscode 和兼容的 Xdebug 扩展来观察变量
- 我在跨过当前语句时出现轻微延迟时观察到了这种行为。
很抱歉这么说,但看起来问题是您使用的 PHP 版本不受支持。损坏的 mysqli::$stat
属性 在 PHP 7.4 中被移除。解决方案是升级您的 PHP 版本。
当触发任何 MySQLi 函数时,错误和错误属性被重置。调用每个函数后必须立即检查它。
例如:
$mysqli->stat();
if($mysqli->error) {
// ...
但是,我强烈建议忘记使用 error
和 errno
属性。只需启用自动 MySQLi 错误报告并停止手动检查错误。
使用 xDebug 时,由于这个 MySQLi 错误,属性永远不会正确显示给您。
我知道你现在负担不起,但请始终考虑使用 PDO 而不是 MySQLi。 PDO 更好更容易。