当前位置: 首页> 最新文章列表> 用 $errno 对不同 SQL 失败类型进行自动化测试

用 $errno 对不同 SQL 失败类型进行自动化测试

M66 2025-05-28

在 PHP 中使用 MySQL 数据库时,执行 SQL 查询时可能会遇到错误。为了方便定位这些错误,可以通过 mysqli 提供的错误码 mysqli::$errno 来判断失败的原因,并进行相应的处理。本文将介绍如何用 mysqli::$errno 自动识别并测试各种 SQL 执行失败的类型。

1. 了解 mysqli::$errno

mysqli::$errno 是一个包含最近执行的 MySQL 查询错误码的属性。它返回一个整数值,用于表示不同类型的错误。这对于开发者来说非常有用,可以帮助我们在执行 SQL 时定位问题。

通常,mysqli::$errnomysqli::$error 配合使用,后者会返回出错时的错误信息,而前者则提供出错的具体错误码。通过这些信息,可以对 SQL 错误做出相应的处理。

2. 常见的 MySQL 错误码

以下是几个常见的 MySQL 错误码示例及其含义:

错误码错误描述
1045Access denied (无权限访问)
1064SQL 语法错误
1146表不存在
1054列不存在
1062重复条目 (Unique constraint violation)

当你执行 SQL 查询时,可以通过 mysqli::$errno 检查这些错误码,并根据错误码做相应的处理。

3. 使用 mysqli::$errno 处理错误

首先,我们需要一个连接到 MySQL 数据库的实例,然后执行 SQL 查询并检查是否有错误发生。以下是一个示例代码:

<?php
$mysqli = new mysqli("localhost", "user", "password", "database");

if ($mysqli->connect_error) {
    die("连接失败: " . $mysqli->connect_error);
}

$query = "SELECT * FROM non_existent_table"; // 故意写错的表名
$result = $mysqli->query($query);

if (!$result) {
    // 如果查询失败,获取错误码和错误信息
    echo "错误码: " . $mysqli->errno . "<br>";
    echo "错误信息: " . $mysqli->error . "<br>";

    // 根据错误码做不同的处理
    switch ($mysqli->errno) {
        case 1045:
            echo "无权限访问,请检查数据库用户的权限。";
            break;
        case 1064:
            echo "SQL 语法错误,请检查查询语法。";
            break;
        case 1146:
            echo "表不存在,请检查表名。";
            break;
        case 1054:
            echo "列不存在,请检查列名。";
            break;
        case 1062:
            echo "重复条目,违反唯一约束。";
            break;
        default:
            echo "其他错误,请检查查询。";
    }
} else {
    // 查询成功,处理结果
    while ($row = $result->fetch_assoc()) {
        echo "数据: " . $row['column_name'] . "<br>";
    }
}

$mysqli->close();
?>

在上面的代码中,如果 SQL 执行失败,首先会打印错误码和错误信息。然后,根据 mysqli::$errno 的值,我们通过 switch 语句判断错误类型,并提供具体的错误提示。

4. 使用 mysqli::$errno 进行错误测试

你可以通过故意引入错误来测试 mysqli::$errno 的效果。例如,可以尝试以下几种常见错误:

  • 错误的表名: 当查询表不存在时,MySQL 会返回错误码 1146(表不存在)。

  • 错误的 SQL 语法: 语法错误通常返回 1064 错误码。

  • 权限问题: 如果数据库用户没有足够的权限,则返回错误码 1045

测试时,你可以修改 SQL 查询语句来触发这些错误,并通过 mysqli::$errno 获取相应的错误码。

5. 示例:结合 URL 测试失败的 SQL 查询

在一些复杂的 SQL 查询中,可能会涉及到使用 URL 或外部数据源。如果查询中涉及到外部资源,我们可以使用类似下面的方式来检查 URL 是否有效: