當前位置: 首頁> 最新文章列表> 如何在PHP 中優雅地打印mysqli::$errno 與錯誤信息

如何在PHP 中優雅地打印mysqli::$errno 與錯誤信息

M66 2025-05-17

在PHP 中使用mysqli進行數據庫操作時,經常會遇到需要打印錯誤信息的情況。通常, mysqli擴展提供了錯誤代碼( mysqli::$errno ) 和錯誤信息( mysqli::$ error ),可以幫助我們在發生錯誤時及時反饋問題。但是,如何優雅地打印這些錯誤信息,讓錯誤日誌更加清晰、易於調試呢?本文將向您展示如何在PHP 中優雅地使用mysqli::$errno打印錯誤代碼和錯誤信息。

1. 基礎的mysqli錯誤處理

首先,我們來看一下PHP 中如何使用mysqli進行數據庫連接和基本的錯誤處理。在mysqli連接對像中,錯誤信息和錯誤代碼可以通過mysqli::$errormysqli::$errno屬性獲取。

示例代碼:

 <?php
$host = 'localhost';
$username = 'root';
$password = 'password';
$database = 'test_db';

// 創建 MySQLi 連接
$conn = new mysqli($host, $username, $password, $database);

// 检查連接是否成功
if ($conn->connect_error) {
    echo "連接失败: " . $conn->connect_error;
    exit();
}

// 執行查詢
$sql = "SELECT * FROM non_existing_table";
$result = $conn->query($sql);

// 檢查查詢是否成功
if (!$result) {
    // 打印錯誤代碼和錯誤信息
    echo "錯誤代碼: " . $conn->errno . "<br>";
    echo "錯誤訊息: " . $conn->error;
}

// 关闭連接
$conn->close();
?>

解釋:

  • 使用connect_error檢查數據庫連接是否成功。

  • 使用errnoerror獲取錯誤代碼和錯誤信息。

  • 在執行查詢時,如果出現錯誤,通過errnoerror輸出詳細信息。

2. 優雅地處理和記錄錯誤信息

直接輸出錯誤信息雖然有效,但在生產環境中,通常我們希望記錄錯誤日誌並避免將敏感信息暴露給最終用戶。在實際開發中,優雅的錯誤處理方式不僅可以幫助開發人員快速定位問題,也能提高系統的安全性和用戶體驗。

示例:日誌記錄錯誤信息

我們可以使用error_log()函數將錯誤信息寫入日誌文件。以下是改進後的代碼:

 <?php
$host = 'localhost';
$username = 'root';
$password = 'password';
$database = 'test_db';

$conn = new mysqli($host, $username, $password, $database);

if ($conn->connect_error) {
    // 使用 error_log 记录連接错误
    error_log("連接失败: " . $conn->connect_error, 3, "/var/log/php_errors.log");
    exit();
}

$sql = "SELECT * FROM non_existing_table";
$result = $conn->query($sql);

if (!$result) {
    // 記錄錯誤日誌
    error_log("錯誤代碼: " . $conn->errno . " 錯誤訊息: " . $conn->error, 3, "/var/log/php_errors.log");

    // 输出友好的錯誤訊息
    echo "操作失敗,請稍後再試。";
}

$conn->close();
?>

解釋:

  • 使用error_log()將錯誤信息寫入指定的日誌文件(如/var/log/php_errors.log )。

  • 將用戶友好的錯誤信息顯示在前端,避免暴露過多的技術細節。

  • 通過3參數設置將錯誤寫入文件。

3. 在生產環境中優雅地禁用錯誤輸出

在生產環境中,我們通常會禁用PHP 的錯誤顯示,而是記錄到日誌中。為了防止敏感的錯誤信息暴露給終端用戶,我們可以通過修改php.ini或使用以下代碼禁用錯誤輸出:

示例代碼:

 <?php
// 禁用錯誤顯示
ini_set('display_errors', '0');

// 啟用錯誤日誌記錄
ini_set('log_errors', '1');
ini_set('error_log', '/var/log/php_errors.log');

// 連接数据库并執行查詢
$conn = new mysqli($host, $username, $password, $database);

if ($conn->connect_error) {
    // 记录連接错误
    error_log("連接失败: " . $conn->connect_error, 3, "/var/log/php_errors.log");
    exit();
}

$sql = "SELECT * FROM non_existing_table";
$result = $conn->query($sql);

if (!$result) {
    // 记录錯誤訊息
    error_log("錯誤代碼: " . $conn->errno . " 錯誤訊息: " . $conn->error, 3, "/var/log/php_errors.log");
    echo "操作失敗,請稍後再試。";
}

$conn->close();
?>

解釋:

  • ini_set('display_errors', '0') :禁用錯誤顯示。

  • ini_set('log_errors', '1') :啟用錯誤日誌記錄。

  • 錯誤信息通過error_log()函數記錄到指定的文件。

4. 使用自定義錯誤處理函數

為了使錯誤處理更加靈活,我們可以定義一個自定義的錯誤處理函數,在其中統一處理mysqli::$errnomysqli::$error 。這樣可以減少重複代碼,並提高代碼的可維護性。

示例代碼:

 <?php
// 自定義錯誤處理函數
function handleMysqliError($conn) {
    // 將錯誤記錄到日誌
    error_log("錯誤代碼: " . $conn->errno . " 錯誤訊息: " . $conn->error, 3, "/var/log/php_errors.log");

    // 显示友好的錯誤訊息
    echo "操作失敗,請稍後再試。";
}

// 創建数据库連接
$conn = new mysqli($host, $username, $password, $database);

if ($conn->connect_error) {
    handleMysqliError($conn);
    exit();
}

$sql = "SELECT * FROM non_existing_table";
$result = $conn->query($sql);

if (!$result) {
    handleMysqliError($conn);
}

$conn->close();
?>

解釋:

  • handleMysqliError函數封裝了錯誤處理的邏輯。

  • 在發生錯誤時,直接調用該函數,既簡化了代碼,又確保了統一的錯誤處理方式。

結語

在PHP 中,使用mysqli::$errnomysqli::$error打印錯誤信息是非常常見的需求。為了讓錯誤處理更加優雅和安全,我們可以通過日誌記錄、禁用錯誤輸出、使用自定義錯誤處理函數等方式,來提升系統的健壯性和用戶體驗。

希望本文能幫助你更好地理解如何在PHP 中優雅地處理數據庫操作中的錯誤。如果有任何問題,歡迎留言討論!