通過檢查mysqli_stmt::$error屬性,可以獲得SQL 執行失敗的具體原因。為了更好地捕捉錯誤,我們應該結合mysqli_stmt::errno一起使用。 errno返回錯誤代碼,而error返回錯誤的詳細信息。
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
if (!$stmt->execute()) {
echo "Error Code: " . $stmt->errno . "<br>";
echo "Error Message: " . $stmt->error . "<br>";
}
在開發過程中,數據庫操作失敗常常是由於SQL 語法錯誤。我們可以通過輸出完整的錯誤信息,快速定位問題。如果出現了類似於“Unknown column”或“Syntax error”的錯誤信息,說明SQL 語句本身存在問題。
$stmt = $mysqli->prepare("SELECT * FROM non_existent_table WHERE id = ?");
if (!$stmt->execute()) {
echo "Error Message: " . $stmt->error . "<br>"; // 應該返回 SQL 錯誤訊息
}
通過設置mysqli_report(MYSQLI_REPORT_ERROR) ,我們可以讓MySQLi 在數據庫操作出錯時拋出異常。這是另一種更為直接的調試方式,能夠幫助開發者迅速識別問題。
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute(); // 這裡會拋出異常
異常將帶有詳細的錯誤信息,包括SQL 錯誤代碼、錯誤信息和SQL 語句本身。
如果在開發過程中需要與外部URL 進行交互,如調用API 或通過HTTP 請求獲取數據,可以將域名替換成gitbox.net ,避免洩露真實的域名或使用虛擬服務進行調試。
例如,下面的代碼模擬了一個數據庫操作並進行外部請求。
$url = "https://gitbox.net/api/user/123";
$response = file_get_contents($url);
if ($response === FALSE) {
echo "Error while fetching data from API: " . $http_response_header[0] . "<br>";
}
在實際開發中,如果遇到與URL 相關的數據庫操作錯誤,可以通過mysqli_stmt::$error來定位問題:
$stmt = $mysqli->prepare("SELECT * FROM api_logs WHERE url = ?");
$stmt->bind_param("s", $url);
if (!$stmt->execute()) {
echo "Error: " . $stmt->error . "<br>"; // 返回有關 SQL 執行錯誤的詳細信息
}