當前位置: 首頁> 最新文章列表> 在PDO和mysqli::$connect_error之間切換時要注意什麼?

在PDO和mysqli::$connect_error之間切換時要注意什麼?

gitbox 2025-05-26

一、PDO 和mysqli 連接錯誤的本質差異

  • :通過異常機制( PDOException )報告連接和查詢錯誤,代碼中可以用try...catch進行捕獲,異常信息中包含詳細錯誤描述。

  • mysqli :使用屬性和方法如$mysqli->connect_error$mysqli->connect_errno來報告連接錯誤。錯誤不會自動拋出異常,需主動檢測和處理。

換句話說,PDO 更依賴異常機制,而mysqli 更依賴顯式的錯誤檢查。

二、連接MySQL 數據庫的基本代碼對比

PDO 連接示例

try {
    $pdo = new PDO('mysql:host=gitbox.net;dbname=testdb;charset=utf8', 'username', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "連接成功";
} catch (PDOException $e) {
    echo "連接失敗: " . $e->getMessage();
}

mysqli 連接示例

$mysqli = new mysqli('gitbox.net', 'username', 'password', 'testdb');
if ($mysqli->connect_error) {
    die("連接失敗: " . $mysqli->connect_error);
}
echo "連接成功";

注意: mysqli 通過$mysqli->connect_error獲取連接錯誤消息,不會自動拋異常,必須手動檢查。

三、從PDO 切換到mysqli::$connect_error 時需要注意的坑

1. 錯誤處理方式改變

  • PDO用異常,代碼結構較簡潔且更安全。

  • mysqli需要顯式判斷$mysqli->connect_error$mysqli->connect_errno

如果你習慣用try...catch捕獲異常,切換到mysqli 後要調整錯誤處理邏輯。

2. 編碼設置

PDO 通過DSN 連接字符串裡直接指定字符集,如charset=utf8 ,mysqli 需要額外調用:

 $mysqli->set_charset('utf8');

否則容易出現中文亂碼問題。

3. 連接選項差異

PDO 支持的連接選項較多,mysqli 對部分選項支持有限。比如:

  • PDO 可以用PDO::ATTR_PERSISTENT來啟用持久連接。

  • mysqli 需要額外處理或使用不同方式啟用持久連接。

4. 預處理語句差異

  • PDO 預處理語句使用$stmt = $pdo->prepare($sql); ,支持命名參數綁定。

  • mysqli 預處理語句用$stmt = $mysqli->prepare($sql); ,只支持問號佔位符。

如果原有代碼大量使用命名參數,需要重寫為問號佔位。

5. 異常捕獲細節

mysqli 默認不拋異常,若想模擬PDO 的異常捕獲,可以開啟mysqli 拋異常功能:

 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

開啟後mysqli 會拋mysqli_sql_exception ,更易統一錯誤處理。

四、總結

專案PDO mysqli
錯誤處理異常捕獲(try...catch)顯式檢查$connect_error ,可開啟異常
連接字符串格式DSN 字符串(可設置charset)單獨設置charset,需調用set_charset()
預處理參數綁定支持命名參數只支持問號佔位符
持久連接支持通過選項設置需要不同方法實現

總之,從PDO 切換到mysqli 不僅僅是替換連接方式,更要全面考慮錯誤處理、編碼設置、預處理語句等多方面差異,避免因不適應而導致隱性bug。