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

PHP 使用 PDO 連接 Access (.mdb) 資料庫完整教學

     編輯:PHP 綜合知識

雖然 Access 已非主流部署選擇,但在維護舊系統、匯入歷史資料或 Windows 內部工具時,仍常需以 PHP 讀取 .mdb (Access 2003) 或 .accdb (Access 2007+) 檔案。本文示範使用 PDO_ODBC 驅動程式建立連線,並說明 32/64 位元環境的常見坑點。

前置需求

  1. Windows 伺服器(Linux 需額外安裝 mdbtools + unixODBC,設定較複雜)。
  2. 已安裝 Microsoft Access Database Engine (ACE) 驅動程式:
  3. PHP 啟用 extension=pdo_odbc(php.ini)。

連線字串 (DSN) 範例

檔案類型DSN 範本
.mdb (Jet 4.0)odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\path\data.mdb;Uid=;Pwd=;
.accdb (ACE 12.0+)odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C:\path\data.accdb;Uid=;Pwd=;
帶密碼 .mdbodbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\path\data.mdb;Pwd=your_password;

完整程式碼

<?php
/**
 * 建立 PDO 連線至 Access
 * @param string $filePath .mdb 或 .accdb 絕對路徑
 * @param string $password 資料庫密碼 (可選)
 * @return PDO
 */
function createAccessPdo(string $filePath, string $password = ''): PDO
{
    if (!file_exists($filePath)) {
        throw new InvalidArgumentException("找不到檔案:$filePath");
    }

    $ext = strtolower(pathinfo($filePath, PATHINFO_EXTENSION));
    $driver = ($ext === 'accdb')
        ? '{Microsoft Access Driver (*.mdb, *.accdb)}'
        : '{Microsoft Access Driver (*.mdb)}';

    $dsn = "odbc:Driver=$driver;Dbq=" . realpath($filePath);
    if ($password !== '') {
        $dsn .= ";Pwd=$password";
    }

    $pdo = new PDO($dsn, '', '', [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false, // 使用原生預處理
    ]);

    return $pdo;
}

// --- 使用範例 ---
try {
    $pdo = createAccessPdo(__DIR__ . '/data.mdb'); // 同目錄下的 data.mdb

    // 查詢
    $stmt = $pdo->query('SELECT * FROM `user`');
    $rows = $stmt->fetchAll();

    echo "<pre>";
    print_r($rows);
    echo "</pre>";

    // 參數化查詢 (防 SQL Injection)
    $stmt = $pdo->prepare('SELECT * FROM `user` WHERE `id` = ? AND `status` = ?');
    $stmt->execute([123, 1]);
    $user = $stmt->fetch();
    var_dump($user);

    // 新增資料
    $stmt = $pdo->prepare('INSERT INTO `user` (`name`, `email`, `created_at`) VALUES (?, ?, NOW())');
    $stmt->execute(['張三', 'zhang@example.com']);
    echo "新增 ID:{$pdo->lastInsertId()}";

} catch (PDOException $e) {
    error_log("Access 連線失敗:{$e->getMessage()}");
    die("資料庫連線錯誤,請稍後再試");
}
?>

常見問題排查

「Could not find driver」
PHP 未啟用 pdo_odbc,或 ODBC 驅動程式未安裝。執行 php -m | grep pdo 確認。
「Data source name not found / Driver not found」
DSN 中的 Driver 名稱與系統安裝的不符。至「ODBC 資料來源管理員」→「驅動程式」頁確認確切名稱(含大小寫、空格、版本號)。
32/64 位元不匹配
PHP 為 64 位元時,必須安裝 64 位元 ACE 驅動;若 PHP 為 32 位元(舊版 XAMPP),需安裝 32 位元驅動。兩者不可混用。
「General error: Unable to open registry key」
權限不足。確保執行 PHP 的使用者 (IIS_IUSRS / Apache 服務帳號) 對 .mdb 檔案及其所在資料夾有「讀取/寫入」權限。

效能與替代方案建議

  • Access 非為高併發設計,連線數超過 10-20 即明顯降級。建議將資料 遷移至 SQLite / MySQL / PostgreSQL。
  • 唯讀匯出可用 mdbtools (mdb-export) 或 Microsoft Access → 匯出 → CSV 批次轉換。
  • 若必須長期共存,建議建立「同步服務」定時將 Access 資料同步至主資料庫,PHP 僅讀取主庫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved