mysqli_error() 是开发者最熟悉的错误处理函数之一,它的作用是在执行数据库操作失败时,返回一个描述错误的字符串。例如,在执行一个错误的SQL语句时:
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELEC * FROM users"; // 故意写错 SELECT
$result = $mysqli->query($sql);
if (!$result) {
echo "SQL 执行失败: " . mysqli_error($mysqli);
}
输出的将是类似这样的错误信息:
SQL 执行失败: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELEC * FROM users' at line 1
这对于定位语法错误是很有帮助的。
与mysqli_error()不同,mysqli::$info在SQL语句执行成功后提供关于语句处理结果的更多上下文信息。尤其在执行INSERT, UPDATE, DELETE等语句时,它能告诉你多少行被影响、是否有重复的行被跳过等。
例如:
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "UPDATE users SET status='active' WHERE last_login < '2024-01-01'";
$mysqli->query($sql);
echo "影响详情: " . $mysqli->info;
可能的输出类似:
影响详情: Rows matched: 3 Changed: 2 Warnings: 0
这意味着总共3行匹配到,但只有2行被实际修改。
在执行SQL语句时,可以将这两个函数结合起来使用:如果语句执行失败,使用mysqli_error()获取错误信息;如果执行成功,再使用mysqli::$info获取执行详情。这种方式适用于调试、日志记录,甚至在后台管理面板中显示操作结果。
一个典型的封装函数如下:
function executeQuery($mysqli, $sql) {
if ($mysqli->query($sql) === TRUE) {
return [
'success' => true,
'info' => $mysqli->info
];
} else {
return [
'success' => false,
'error' => mysqli_error($mysqli)
];
}
}
调用示例:
$response = executeQuery($mysqli, "UPDATE users SET status='inactive' WHERE id IN (1,2,3)");
if ($response['success']) {
echo "更新成功,详情如下:" . $response['info'];
} else {
echo "更新失败,错误信息:" . $response['error'];
}
输出(成功时):
更新成功,详情如下:Rows matched: 3 Changed: 3 Warnings: 0
输出(失败时):
更新失败,错误信息:Unknown column 'statuz' in 'field list'
数据迁移与同步任务
在写入大量数据时,了解是否数据被更新还是跳过,对判断任务成功与否非常关键。
后台日志系统
对管理员而言,不只是知道某个操作成功或失败,还需了解具体影响的记录数。
自动化测试
当期望影响某些行时,结合使用这两个函数可以验证SQL语句的正确性。