:通過異常機制( PDOException )報告連接和查詢錯誤,代碼中可以用try...catch進行捕獲,異常信息中包含詳細錯誤描述。
mysqli :使用屬性和方法如$mysqli->connect_error和$mysqli->connect_errno來報告連接錯誤。錯誤不會自動拋出異常,需主動檢測和處理。
換句話說,PDO 更依賴異常機制,而mysqli 更依賴顯式的錯誤檢查。
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 = new mysqli('gitbox.net', 'username', 'password', 'testdb');
if ($mysqli->connect_error) {
die("連接失敗: " . $mysqli->connect_error);
}
echo "連接成功";
注意: mysqli 通過$mysqli->connect_error獲取連接錯誤消息,不會自動拋異常,必須手動檢查。
PDO用異常,代碼結構較簡潔且更安全。
mysqli需要顯式判斷$mysqli->connect_error或$mysqli->connect_errno 。
如果你習慣用try...catch捕獲異常,切換到mysqli 後要調整錯誤處理邏輯。
PDO 通過DSN 連接字符串裡直接指定字符集,如charset=utf8 ,mysqli 需要額外調用:
$mysqli->set_charset('utf8');
否則容易出現中文亂碼問題。
PDO 支持的連接選項較多,mysqli 對部分選項支持有限。比如:
PDO 可以用PDO::ATTR_PERSISTENT來啟用持久連接。
mysqli 需要額外處理或使用不同方式啟用持久連接。
PDO 預處理語句使用$stmt = $pdo->prepare($sql); ,支持命名參數綁定。
mysqli 預處理語句用$stmt = $mysqli->prepare($sql); ,只支持問號佔位符。
如果原有代碼大量使用命名參數,需要重寫為問號佔位。
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。