首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP PEAR DB 實戰:從安裝到多資料庫存取完整教學

     編輯:PHP 相關知識

為什麼需要資料庫抽象層?

PHP 內建針對 MySQL、PostgreSQL、SQLite 等各有專屬函數(mysqli_*、pg_*、sqlite_*),直接使用會導致程式碼強綁定特定資料庫,移植時需大幅重寫。PEAR DB 提供統一介面,僅需更換 DSN 即可切換資料庫後端,大幅降低維護成本。

環境準備與安裝

1. 安裝 PEAR 套件管理器

# Linux/macOS
wget https://pear.php.net/go-pear.phar
php go-pear.phar

# Windows (XAMPP/WAMP)
# 控制台執行 php go-pear.phar 並依提示設定路徑

2. 安裝 DB 套件

pear install DB
# 若需特定驅動可額外安裝,如 pear install DB_mysql

3. 啟用 PHP 擴展

編輯 php.ini,確認以下擴展已啟用(去掉分號):

extension=pdo_mysql
extension=pdo_pgsql
extension=pdo_sqlite
; 視實際使用資料庫啟用對應 PDO 驅動

重啟 Apache/Nginx 使設定生效。

特別提醒:整合套件環境(如 DedeAMPZ)

若使用整合安裝包,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();
?>

進階技巧與最佳實踐

  1. 使用預備陳述式防注入:
    $sth = $db->prepare('SELECT * FROM users WHERE email = ? AND status = ?');
    $db->execute($sth, array($email, 'active'));
  2. 交易控制:
    $db->autoCommit(false);
    $db->query('INSERT ...');
    $db->query('UPDATE ...');
    $db->commit(); // 或 $db->rollback();
  3. 錯誤模式自訂:
    // 拋出例外而非回傳錯誤物件 (PEAR DB 1.7+)
    $db->setOption('error_handling', PEAR_ERROR_EXCEPTION);
  4. 連線持久化:DSN 加上 persistent=true 參數(視驅動支援度)。

常見問題排查

現象可能原因解決方案
Class 'DB' not foundPEAR 安裝路徑不在 include_path檢查 pear config-get php_dir 是否在 include_path,或用絕對路徑 require
DB Error: connect failedDSN 錯誤/權限不足/服務未啟動驗證 DSN 格式、帳號密碼、資料庫服務狀態、防火牆
查詢無結果但不報錯未檢查 DB::isError()每次 query/execute 後必須判斷錯誤物件
中文亂碼連線字元集未設定DSN 加上 ?charset=utf8 或執行 SET NAMES utf8

總結

PEAR DB 雖屬上一世代技術,但其「統一介面、DSN 驅動切換、錯誤物件、預備陳述式」等核心設計思想深深影響了後來的 PDO、Doctrine DBAL、Laravel Eloquent 等現代框架。掌握 PEAR DB 不僅能維護舊專案,更能幫助你理解現代 PHP 資料庫抽象層的演進邏輯。新專案請直接採用 PDO 或成熟 ORM。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved