首頁  >  問答  >  主體

我們應該手動檢查 mysqli_connect() 錯誤嗎?

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」的存取被拒絕(使用密碼: 是的)

如您所看到的,錯誤訊息顯示了兩次!手動“調試”實際上提供的資訊較少。

我們是否應該手動檢查連線錯誤?我們能透過這種方式獲得比自動警告更多的資訊嗎?這是推薦的做法嗎?

P粉031492081P粉031492081381 天前727

全部回覆(1)我來回復

  • P粉251903163

    P粉2519031632023-10-28 00:52:28

    永遠不要手動顯示連線錯誤!

    如果 MySQLi 無法開啟與 MySQL 的連接,它將產生警告。此警告告訴您需要了解的所有信息,包括錯誤代碼、錯誤訊息以及代碼中發生錯誤的位置。手動檢查錯誤不會為您提供更多資訊。

    如果您看不到警告並且無法建立連接,則可能表示您的 PHP 未配置為顯示它們。在這種情況下,您必須檢查伺服器上的錯誤日誌檔案。如果您不知道它在哪裡,請使用 phpinfo() 取得該資訊並蒐索 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_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

    不要捕獲異常,除非您真的知道如何處理它們! 如何使用 mysqli 正確連接

    中描述了一個可能的用例

    mysqli_error() 可以顯示任何與連線相關的問題嗎?

    沒有。 mysqli_error($conn) 預計 mysqli 連線成功。 $conn 必須是有效的 mysqli 連接,否則您會收到此錯誤訊息:

    $conn->errormysqli_error($conn) 都無法顯示任何與連線相關的錯誤!


    相關: 呼叫「mysqli_stmt_prepare」時我應該手動檢查錯誤嗎?

    回覆
    0
  • 取消回覆