mysqli_connect()
的 PHP 手冊建議檢查傳回值並在螢幕上顯示錯誤訊息。
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db"); if (!$link) { echo "Error: Unable to connect to MySQL." . PHP_EOL; echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL; echo "Debugging error: " . mysqli_connect_error() . PHP_EOL; exit; }
類似地,對於 OOP 風格的建構函數,建議這樣做:
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); if ($mysqli->connect_error) { die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); }
Stack Overflow 上的一些使用者甚至使用了帶有 mysqli_error($conn)
的程式碼,如下所示:
$conn = mysqli_connect('localhost', 'a', 'a'); if (!$con) { die('Could not connect: ' . mysqli_error($conn)); }
但是,在過去的幾周里,我一直在問自己一個問題,為什麼我需要這樣做?第一個範例的輸出是:
警告:mysqli_connect():(HY000/1045):使用者存取被拒絕 'my_user'@'localhost'(使用密碼:YES) C:xampp...mysqli.php 第 4 行
錯誤:無法連線到 MySQL。偵錯錯誤號碼:1045 偵錯中 錯誤:使用者「my_user」@「localhost」的存取被拒絕(使用密碼: 是的)
如您所看到的,錯誤訊息顯示了兩次!手動“調試”實際上提供的資訊較少。
我們是否應該手動檢查連線錯誤?我們能透過這種方式獲得比自動警告更多的資訊嗎?這是推薦的做法嗎?
永遠不要手動顯示連線錯誤!
如果 MySQLi 無法開啟與 MySQL 的連接,它將產生警告。此警告告訴您需要了解的所有信息,包括錯誤代碼、錯誤訊息以及代碼中發生錯誤的位置。手動檢查錯誤不會為您提供更多資訊。
如果您看不到警告並且無法建立連接,則可能表示您的 PHP 未配置為顯示它們。在這種情況下,您必須檢查伺服器上的錯誤日誌檔案。如果您不知道它在哪裡,請使用
phpinfo() code>
取得該資訊並蒐索error_log
。它會告訴您錯誤日誌檔案的位置。如果錯誤日誌中沒有警告,可能表示您的 PHP 錯誤報告已被靜默(完全或只是警告)。檢查您的 PHP 配置。
在生產環境中,應保留這些設定:
error_reporting
必須為E_ALL
log_errors
必須開啟
#display_errors
必須關閉
#在開發環境中,應保留這些設定:
error_reporting
必須為E_ALL
log_errors
必須開啟
#display_errors
必須開啟
#正如您在錯誤訊息中看到的,您的資料庫使用者名稱和密碼已洩露給最終用戶。這是您不想向任何人展示的敏感資訊。事實上,一般用戶不會理解這個神祕的訊息。這就是為什麼在生產環境中必須始終關閉
display_errors
的原因。在伺服器上記錄錯誤是安全的。警告與異常
警告不會停止腳本。如果發出警告,腳本將繼續執行,直到遇到致命錯誤。在大多數情況下,您需要拋出異常來停止腳本。 不要使用
die/exit
! 如果無法建立mysqli連接,則應拋出異常,如果未處理該異常,則會冒泡並以致命錯誤停止腳本。您可以配置 mysqli 自動拋出異常。這是非常寶貴的,因為所有 mysqli 函數都可能因多種原因而失敗,而且它們不會通知您任何問題,除非您手動檢查其中每一個錯誤。在開啟連線之前使用以下行:不要捕獲異常,除非您真的知道如何處理它們! 如何使用 mysqli 正確連接
中描述了一個可能的用例mysqli_error()
可以顯示任何與連線相關的問題嗎?沒有。
mysqli_error($conn)
預計 mysqli 連線成功。$conn
必須是有效的 mysqli 連接,否則您會收到此錯誤訊息:$conn->error
和mysqli_error($conn)
都無法顯示任何與連線相關的錯誤!相關: 呼叫「mysqli_stmt_prepare」時我應該手動檢查錯誤嗎? p>