PDO (PHP Data Objects) 是 PHP 官方提供的資料庫抽象層擴展,為不同資料庫(MySQL、PostgreSQL、SQLite、Oracle 等)提供統一的訪問介面。它解決了跨資料庫平台開發與遷移的難題,是現代 PHP 專案的標準選擇。
透過實例化 PDO 建構子,使用 DSN (Data Source Name) 字串指定資料庫類型、主機、資料庫名稱:
<?php
$dbms = 'mysql';
$dbName = 'dormitory';
$host = 'localhost';
$user = 'root';
$pwd = '';
$dsn = "$dbms:host=$host;dbname=$dbName";
try {
$pdo = new PDO($dsn, $user, $pwd);
// 設定錯誤模式為例外(推薦)
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo '連線成功!';
} catch (PDOException $e) {
echo '連線失敗:' . $e->getMessage();
}
?>
注意:PHP 5.2 需啟用 php_pdo.dll + php_pdo_mysql.dll;PHP 5.3+ 僅需 php_pdo_mysql.dll。
| 方法 | 適用場景 | 回傳值 | 特點 |
|---|---|---|---|
exec() | INSERT、UPDATE、DELETE | 受影響行數 (int) | 直接執行,無結果集 |
query() | SELECT | PDOStatement 物件 | 一次性查詢,適合無參數 SQL |
prepare() + execute() | 所有類型(含參數化) | PDOStatement 物件 | 預處理語句,防 SQL 注入,可重複執行 |
<?php
$sql = "SELECT * FROM building WHERE id = ? AND status = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([1, 'active']); // 位置佔位符
// 或具名佔位符
$sql = "SELECT * FROM users WHERE username = :user AND password = :pass";
$stmt = $pdo->prepare($sql);
$stmt->execute([':user' => $username, ':pass' => $password]);
// 獲取結果
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
均為 PDOStatement 物件方法:
fetch($mode = PDO::FETCH_ASSOC):取得下一行,單條記錄陣列/物件。fetchAll($mode):取得所有行,二維陣列。fetchColumn($col = 0):取得下一行指定欄位的值(純量)。// 常用模式常數
PDO::FETCH_ASSOC // 關聯陣列
PDO::FETCH_NUM // 數值索引陣列
PDO::FETCH_OBJ // 匿名物件
PDO::FETCH_CLASS // 映射到指定類別
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 推薦:拋出 PDOException
// PDO::ERRMODE_SILENT // 預設:靜默,需手動檢查 errorCode/errorInfo
// PDO::ERRMODE_WARNING // 觸發 E_WARNING
errorCode():回傳 SQLSTATE 代碼(00000 表示成功)。errorInfo():回傳陣列 [SQLSTATE, 驅動代碼, 驅動訊息]。注意:預處理語句執行後,錯誤資訊屬於 PDOStatement 物件,需呼叫 $stmt->errorCode() / $stmt->errorInfo()。
<?php
$sql = "SELECT username, password FROM users WHERE username = ? AND password = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$username, $password]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo "登入成功";
} else {
echo "帳號或密碼錯誤";
}
?>
PDO 以統一介面、預處理語句、多種獲取模式、靈活錯誤處理,成為 PHP 資料庫操作的基石。掌握 prepare/execute、錯誤模式設定、結果集獲取三大核心,即可應對絕大多數業務場景。