PHP Data Objects (PDO) 是 PHP 的資料庫訪問抽象層,提供統一介面操作多種資料庫(MySQL、PostgreSQL、SQLite 等),提高代碼可移植性與可維護性。特性:編碼一致、靈活、高性能(C 底層實現)、面向對象。
修改 php.ini 啟用擴展:
extension=pdo_mysql
; extension=pdo_pgsql
; extension=pdo_sqlite
重啟 Web 服務,phpinfo() 檢查 PDO 區塊是否出現。
try {
$dsn = 'mysql:host=localhost;dbname=imooc_pdo;charset=utf8mb4';
$pdo = new PDO($dsn, 'root', '', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
var_dump($pdo);
} catch (PDOException $e) {
echo '連接失敗: ' . $e->getMessage();
}
$dsn = 'uri:file:///path/to/dsn.txt'; // 文件內容: mysql:host=localhost;dbname=imooc_pdo
$pdo = new PDO($dsn, 'root', '');
; php.ini
pdo.dsn.imooc = "mysql:host=localhost;dbname=imooc_pdo"
; PHP 代碼
$pdo = new PDO('imooc', 'root', '');
| 方法 | 用途 | 返回值 |
|---|---|---|
exec($sql) | 執行 INSERT/UPDATE/DELETE/DDL | 影響行數 (int),失敗 false |
query($sql) | 執行 SELECT | PDOStatement 物件,失敗 false |
prepare($sql) | 預處理語句(防注入) | PDOStatement 物件 |
lastInsertId() | 獲取最後自增 ID | string/int |
beginTransaction() | 開啟事務 | bool |
commit() / rollBack() | 提交/回滾事務 | bool |
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'root', '', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
// 建表
$pdo->exec("CREATE TABLE IF NOT EXISTS user (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL UNIQUE,
password CHAR(60) NOT NULL,
email VARCHAR(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
// 新增(預處理)
$stmt = $pdo->prepare("INSERT INTO user (username, password, email) VALUES (?, ?, ?)");
$stmt->execute(['alice', password_hash('secret', PASSWORD_DEFAULT), 'alice@example.com']);
echo "新增 ID: " . $pdo->lastInsertId();
// 查詢
$stmt = $pdo->query("SELECT * FROM user");
while ($row = $stmt->fetch()) {
echo "{$row['id']} - {$row['username']} - {$row['email']}
";
}
// 修改
$stmt = $pdo->prepare("UPDATE user SET email = ? WHERE id = ?");
$stmt->execute(['alice_new@example.com', 1]);
echo "影響行數: " . $stmt->rowCount();
// 刪除
$stmt = $pdo->prepare("DELETE FROM user WHERE id = ?");
$stmt->execute([1]);
echo "刪除行數: " . $stmt->rowCount();
exec() 不能用於 SELECT,否則無結果集返回。exec() 返回 false(非 0),需捕獲異常區分。charset=utf8mb4 必須顯式指定,否則可能出現亂碼。ERRMODE_EXCEPTION,統一異常處理。