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'
數據遷移與同步任務<br> 在寫入大量數據時,了解是否數據被更新還是跳過,對判斷任務成功與否非常關鍵
後台日誌系統<br> 對管理員而言,不只是知道某個操作成功或失敗,還需了解具體影響的記錄數
自動化測試<br> 當期望影響某些行時,結合使用這兩個函數可以驗證SQL語句的正確性