当前位置: 首页> 最新文章列表> 为什么 $errno 总是 0,但查询却没有成功?

为什么 $errno 总是 0,但查询却没有成功?

M66 2025-05-30

在使用 PHP 与 MySQL 进行数据库操作时,mysqli 扩展是一个常见的选择。对于调试数据库查询中的错误,mysqli::$errnomysqli::$error 是非常有用的工具。它们可以帮助开发者获取数据库错误代码和错误信息。然而,有时开发者可能会遇到这样的情况:mysqli::$errno 返回 0,但查询操作依然失败。那么,为什么会出现这种情况呢?下面我们来深入探讨一下。

1. mysqli::$errno 的作用

mysqli::$errno 属性包含了上一次 MySQL 操作中发生的错误代码。通常,0 表示没有发生错误,而非零值则表示发生了某些错误。这是 MySQL 数据库系统中的错误代码,与 mysqli::$error 一起,可以帮助我们快速定位问题。

2. mysqli::$errno 返回 0 的情况

尽管查询失败,mysqli::$errno 仍然返回 0,这种情况可能是由于以下几个原因:

2.1 SQL 查询本身没有产生 MySQL 错误

mysqli::$errno 只会返回 MySQL 服务端的错误代码。如果你的查询没有触发 MySQL 错误(比如语法错误、连接问题等),那么 mysqli::$errno 可能仍然为 0。这时需要注意,即便查询返回结果为空,也并不代表 MySQL 执行过程中出现了错误。

举个例子,当查询没有匹配到任何结果时,MySQL 并不会返回错误,而是简单地返回空结果集,这时 mysqli::$errno 仍为 0,查询本身并没有失败。

2.2 使用了非错误类型的 SQL 查询

有些 SQL 查询(如 INSERTUPDATEDELETE)可能执行成功,但影响的行数为 0,即没有实际修改数据库中的数据。虽然这不是一个错误,但开发者可能认为查询没有成功,从而导致误解。为了更好地判断是否成功,可以通过检查 mysqli_affected_rows() 来确认是否有行被影响。

2.3 数据库连接问题

有时,数据库连接可能已失效或者在查询前已经断开,而 mysqli::$errno 并没有立即返回错误。你可以通过检查 mysqli::$connect_errno 来确认数据库连接是否正常。

3. 如何调试这种问题?

当你发现 mysqli::$errno 始终返回 0,但查询仍然失败时,可以采取以下方法进行调试:

3.1 使用 mysqli::$error 来获取更多信息

mysqli::$error 属性包含了与当前操作相关的 MySQL 错误信息,即便 mysqli::$errno 返回 0,你仍然可以通过 mysqli::$error 来获取一些线索。即便 errno0error 可能会给出一些额外的提示。

if ($mysqli->errno) {
    echo "Error number: " . $mysqli->errno . "<br>";
    echo "Error message: " . $mysqli->error . "<br>";
}

3.2 检查 SQL 语句

确保你的 SQL 查询没有语法错误或逻辑错误。可以将查询打印出来,并在数据库管理工具(如 phpMyAdmin)中直接执行它,看看是否返回预期结果。

3.3 查看影响的行数

对于 INSERTUPDATEDELETE 查询,执行后应检查 mysqli_affected_rows() 函数返回的结果。如果返回 0,说明虽然查询执行了,但没有任何数据被修改。

$affected_rows = $mysqli->affected_rows;
if ($affected_rows === 0) {
    echo "No rows were affected by the query.<br>";
}

3.4 检查数据库连接

如果怀疑是数据库连接问题,可以使用 mysqli_connect_errno() 来检查数据库连接是否成功。

if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

4. 小结

当使用 mysqli::$errno 时,如果它返回 0,但查询依然失败,可能是查询没有产生 MySQL 错误、查询没有修改任何数据,或者存在其他类型的问题而不是 MySQL 错误。要解决这个问题,开发者应结合 mysqli::$errormysqli_affected_rows() 等工具,进行综合调试。通过这些步骤,你可以更有效地识别并解决数据库查询中的问题。

// 连接数据库
$mysqli = new mysqli("localhost", "username", "password", "database");

// 查询
$query = "SELECT * FROM some_table WHERE id = 1";
$result = $mysqli->query($query);

// 结果处理
if ($mysqli->errno) {
    echo "Error number: " . $mysqli->errno . "<br>";
    echo "Error message: " . $mysqli->error . "<br>";
}

// 关闭连接
$mysqli->close();