雖然 Access 已非主流部署選擇,但在維護舊系統、匯入歷史資料或 Windows 內部工具時,仍常需以 PHP 讀取 .mdb (Access 2003) 或 .accdb (Access 2007+) 檔案。本文示範使用 PDO_ODBC 驅動程式建立連線,並說明 32/64 位元環境的常見坑點。
mdbtools + unixODBC,設定較複雜)。.accdb):2010 Redistributable (x64 建議).mdb):通常隨 Office 安裝,或安裝 2007 Office System Driverextension=pdo_odbc(php.ini)。| 檔案類型 | 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=; |
| 帶密碼 .mdb | odbc: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("資料庫連線錯誤,請稍後再試");
}
?>
pdo_odbc,或 ODBC 驅動程式未安裝。執行 php -m | grep pdo 確認。.mdb 檔案及其所在資料夾有「讀取/寫入」權限。mdbtools (mdb-export) 或 Microsoft Access → 匯出 → CSV 批次轉換。