PHP 內建針對 MySQL、PostgreSQL、SQLite 等各有專屬函數(mysqli_*、pg_*、sqlite_*),直接使用會導致程式碼強綁定特定資料庫,移植時需大幅重寫。PEAR DB 提供統一介面,僅需更換 DSN 即可切換資料庫後端,大幅降低維護成本。
# Linux/macOS
wget https://pear.php.net/go-pear.phar
php go-pear.phar
# Windows (XAMPP/WAMP)
# 控制台執行 php go-pear.phar 並依提示設定路徑
pear install DB
# 若需特定驅動可額外安裝,如 pear install DB_mysql
編輯 php.ini,確認以下擴展已啟用(去掉分號):
extension=pdo_mysql
extension=pdo_pgsql
extension=pdo_sqlite
; 視實際使用資料庫啟用對應 PDO 驅動
重啟 Apache/Nginx 使設定生效。
若使用整合安裝包,PEAR 必須安裝在該環境的 Web 根目錄下(如 DedeAMPZ/WebRoot/Default),否則 require_once('DB.php') 會找不到檔案,拋出 Failed opening required 'DB.php' 錯誤。
<?php
require_once 'DB.php';
// 連線設定
$user = 'root';
$pass = '123456';
$host = 'localhost';
$dbname = 'test';
$dsn = "mysql://$user:$pass@$host/$dbname";
// 建立連線
$db = DB::connect($dsn);
if (DB::isError($db)) { die('連線失敗: ' . $db->getMessage()); }
// 建立資料表
$sql = "CREATE TABLE leapsoul (
`id` INT(11) UNSIGNED NOT NULL,
`name` VARCHAR(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`age` INT(2) NOT NULL,
`birthday` VARCHAR(30) NOT NULL,
`sex` INT(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
$res = $db->query($sql);
if (DB::isError($res)) { die('建表失敗: ' . $res->getMessage()); }
// 批次新增資料
$sql = "INSERT INTO leapsoul (id, name, age, birthday, sex) VALUES
(1, 'leapsoul', 1, '2009-05-13', 1),
(2, 'leapsoul', 1, '2009-05-13', 1),
(3, 'leapsoul', 1, '2009-05-13', 1)";
$res = $db->query($sql);
if (DB::isError($res)) { die('新增失敗: ' . $res->getMessage()); }
// 設定關聯陣列模式查詢
$db->setFetchMode(DB_FETCHMODE_ASSOC);
$sql = "SELECT * FROM leapsoul";
$res = $db->query($sql);
if (DB::isError($res)) { die('查詢失敗: ' . $res->getMessage()); }
// 迴圈輸出
while ($row = $res->fetchRow()) {
echo "Name: {$row['name']}, Birthday: {$row['birthday']}<br>";
}
// 釋放資源並關閉連線
$res->free();
$db->disconnect();
?>
$sth = $db->prepare('SELECT * FROM users WHERE email = ? AND status = ?');
$db->execute($sth, array($email, 'active'));
$db->autoCommit(false);
$db->query('INSERT ...');
$db->query('UPDATE ...');
$db->commit(); // 或 $db->rollback();
// 拋出例外而非回傳錯誤物件 (PEAR DB 1.7+)
$db->setOption('error_handling', PEAR_ERROR_EXCEPTION);
persistent=true 參數(視驅動支援度)。| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| Class 'DB' not found | PEAR 安裝路徑不在 include_path | 檢查 pear config-get php_dir 是否在 include_path,或用絕對路徑 require |
| DB Error: connect failed | DSN 錯誤/權限不足/服務未啟動 | 驗證 DSN 格式、帳號密碼、資料庫服務狀態、防火牆 |
| 查詢無結果但不報錯 | 未檢查 DB::isError() | 每次 query/execute 後必須判斷錯誤物件 |
| 中文亂碼 | 連線字元集未設定 | DSN 加上 ?charset=utf8 或執行 SET NAMES utf8 |
PEAR DB 雖屬上一世代技術,但其「統一介面、DSN 驅動切換、錯誤物件、預備陳述式」等核心設計思想深深影響了後來的 PDO、Doctrine DBAL、Laravel Eloquent 等現代框架。掌握 PEAR DB 不僅能維護舊專案,更能幫助你理解現代 PHP 資料庫抽象層的演進邏輯。新專案請直接採用 PDO 或成熟 ORM。