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

PHP 連接 Access 資料庫三大方案:ODBC 系統 DSN、ODBC 無 DSN、ADO/COM 完整實作

     編輯:PHP 相關知識

雖然 MySQL/PostgreSQL 是 PHP 主流,但企業遷移專案常需連接現有 Access (.mdb/.accdb) 檔案。本文詳解三種連接方案:系統 DSN、無 DSN 連接字串、ADO/COM 元件,含完整代碼、優缺點比較與遷移建議。

方案一:建立系統 DSN + odbc_* 函式

  1. 控制台 → 系統管理工具 → ODBC 資料來源 (64/32 位元對應 PHP 進程) → 系統 DSN → 新增 → Microsoft Access Driver (*.mdb, *.accdb) → 設定資料源名稱 (DSN)、選擇 .mdb 檔案。
  2. PHP 代碼:
<?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 進程位元數一致。

方案二:ODBC 無 DSN 連接字串 (DSN-less)

直接在代碼指定驅動程式與檔案路徑,免建立 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 游標,相容性最佳。

方案三:ADO/COM 元件 (Windows 限定)

透過 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

遷移建議:Access → SQLite/MySQL

  1. 結構遷移:mdbtools (Linux) 或 Access 「另存為」→ ODBC 匯出至 MySQL。
  2. 資料遷移:分批 INSERT ... SELECT 或 ETL 工具 (Talend, Kettle)。
  3. 代碼改造:將 odbc_*/COM 替換為 PDO + sqlite/mysql 驅動,統一資料存取層。
  4. 驗證:自動化測試覆蓋所有查詢路徑,對比結果集。

Access 連接雖可行,但屬過渡方案。新專案請直接選擇跨平台、開源、社群活躍的資料庫引擎。

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