目錄
簡介
主要區別
預處理語句示例比較
PDO 示例
MySQLi 示例
選擇建議
簡介
PDO (PHP Data Objects) 和 MySQLi (MySQL Improved) 都是 PHP 中用于數據庫操作的擴展,都支持預處理語句,但有一些重要區別:
主要區別
-
數據庫支持
-
PDO:支持多種數據庫(MySQL, PostgreSQL, SQLite, Oracle 等)
-
MySQLi:僅支持 MySQL 數據庫
-
-
API 風格
-
PDO:提供一致的面向對象接口(也支持過程式)
-
MySQLi:提供面向對象和過程式兩種接口
-
-
預處理語句
-
PDO:命名參數和位置參數都支持
-
MySQLi:只支持位置參數(?)
-
-
錯誤處理
-
PDO:支持異常處理(可通過 setAttribute 設置)
-
MySQLi:主要使用錯誤代碼和函數
-
預處理語句示例比較
PDO 示例
// 連接
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
?
// 預處理語句 - 命名參數
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id AND status = :status");
$stmt->execute([':id' => $id, ':status' => $status]);
?
// 預處理語句 - 位置參數
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ? AND status = ?");
$stmt->execute([$id, $status]);
MySQLi 示例
// 連接
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
?
// 預處理語句 - 只有位置參數
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ? AND status = ?");
$stmt->bind_param("is", $id, $status); // i=integer, s=string
$stmt->execute();
選擇建議
-
使用 PDO 如果:
-
需要支持多種數據庫
-
想要命名參數的便利性
-
偏好異常處理方式
-
-
使用 MySQLi 如果:
-
只使用 MySQL
-
需要 MySQL 特有的功能(如異步查詢)
-
已經在使用 MySQL 擴展并希望平滑遷移
-
兩者在性能上差異不大,選擇主要取決于項目需求和個人偏好。