雖然 MySQL/PostgreSQL 是 PHP 主流,但企業遷移專案常需連接現有 Access (.mdb/.accdb) 檔案。本文詳解三種連接方案:系統 DSN、無 DSN 連接字串、ADO/COM 元件,含完整代碼、優缺點比較與遷移建議。
<?php
$dsn = 'MyAccessDSN'; // 系統 DSN 名稱
$conn = odbc_connect($dsn, '', ''); // Access 無密碼留空
if (!$conn) die('ODBC 連接失敗: ' . odbc_errormsg());
$sql = "SELECT * FROM Products";
$rs = odbc_exec($conn, $sql);
while (odbc_fetch_row($rs)) {
echo odbc_result($rs, 'ProductName') . "\n";
}
odbc_close($conn);
?>
優點:設定集中管理、多應用共用。
缺點:部署需手動建立 DSN、32/64 位元驅動程式必須與 PHP 進程位元數一致。
直接在代碼指定驅動程式與檔案路徑,免建立 DSN。
<?php
$dbPath = realpath('data/bookinfo.mdb'); // 取得絕對路徑
$connStr = "Driver={Microsoft Access Driver (*.mdb)};Dbq=$dbPath;";
$conn = odbc_connect($connStr, '', '', SQL_CUR_USE_ODBC); // SQL_CUR_USE_ODBC 避免某些驅動游標問題
if (!$conn) die('連接失敗: ' . odbc_errormsg());
$rs = odbc_exec($conn, "SELECT * FROM Books");
while ($row = odbc_fetch_array($rs)) {
print_r($row);
}
odbc_close($conn);
?>
關鍵點:
realpath() 確保路徑正確,避免相對路徑在 CLI/WEB 不同工作目錄下失效。odbc_data_source() 可列出)。SQL_CUR_USE_ODBC 強制使用 ODBC 游標,相容性最佳。透過 PHP COM 類別呼叫 ADODB.Connection,功能最豐富(支援參數化查詢、交易、Recordset 物件操作)。
<?php
$dbPath = realpath('data/bookinfo.mdb');
$connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$dbPath;Persist Security Info=False;";
// .accdb 用 ACE OLEDB 12.0;.mdb 可用 Microsoft.Jet.OLEDB.4.0
try {
$conn = new COM('ADODB.Connection');
$conn->Open($connStr);
$rs = $conn->Execute("SELECT * FROM Books");
while (!$rs->EOF) {
echo $rs->Fields['BookName']->Value . "\n";
$rs->MoveNext();
}
$rs->Close();
$conn->Close();
} catch (com_exception $e) {
echo 'COM 錯誤: ' . $e->getMessage();
}
?>
優點:完整 ADO 功能、參數化查詢防注入、效能較 ODBC 佳。
缺點:僅限 Windows、需啟用 php.ini: extension=com_dotnet、32/64 位元 OLEDB Provider 必須與 PHP 位元數一致(常見坑)。
| 場景 | 推薦方案 | 理由 |
|---|---|---|
| 生產環境 Linux/Unix | ❌ 不支援 | Access 引擎無跨平台版本,建議遷移至 SQLite/MySQL |
| Windows 伺服器、簡單查詢、快速部署 | 方案二 (DSN-less ODBC) | 免建立 DSN、代碼可攜、相容性好 |
| Windows、複雜交易/參數化/存儲過程 | 方案三 (ADO/COM) | 功能最完整、效能最佳 |
| 多應用共用、DBA 統一管理 DSN | 方案一 (系統 DSN) | 集中管理、變更檔案路徑只改 DSN |
mdbtools (Linux) 或 Access 「另存為」→ ODBC 匯出至 MySQL。INSERT ... SELECT 或 ETL 工具 (Talend, Kettle)。odbc_*/COM 替換為 PDO + sqlite/mysql 驅動,統一資料存取層。Access 連接雖可行,但屬過渡方案。新專案請直接選擇跨平台、開源、社群活躍的資料庫引擎。