在 Windows 環境下,PHP 需要讀寫 legacy Access (.mdb/.accdb) 檔案,且不想安裝 ODBC 驅動時,啟用 php_com_dotnet 擴展並使用 ADODB.Connection 是最直接的方案。
php.ini 啟用:extension=com_dotnet、com.allow_dcom = trueC:\data\db.mdb,含資料表 comtest(id, title)<?php
$dbPath = 'C:\\data\\db.mdb';
try {
$conn = new COM('ADODB.Connection') or die('無法實例化 ADODB.Connection');
// 使用 ACE OLEDB 12.0 驅動(支援 .accdb)
$connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={$dbPath};Persist Security Info=False;";
// 若為舊版 .mdb 可用:Provider=Microsoft.Jet.OLEDB.4.0
$conn->Open($connStr);
$rs = $conn->Execute('SELECT id, title FROM comtest');
if ($rs === false) throw new Exception('查詢執行失敗');
echo '<table border="1" cellpadding="5"><tr><th>ID</th><th>Title</th></tr>';
while (!$rs->EOF) {
echo '<tr>';
echo '<td>' . htmlspecialchars($rs->Fields['id']->Value) . '</td>';
echo '<td>' . htmlspecialchars($rs->Fields['title']->Value) . '</td>';
echo '</tr>';
$rs->MoveNext();
}
echo '</table>';
$rs->Close();
$conn->Close();
$rs = null;
$conn = null;
} catch (com_exception $e) {
echo 'COM 錯誤: ' . $e->getMessage();
} catch (Exception $e) {
echo '錯誤: ' . $e->getMessage();
}
com_dotnet 或 PHP 為 Non Thread Safe 版iconv('UTF-8', 'BIG5//IGNORE', $val)$cmd = new COM('ADODB.Command');
$cmd->ActiveConnection = $conn;
$cmd->CommandText = 'SELECT * FROM comtest WHERE id = ?';
$cmd->CommandType = 1; // adCmdText
$param = $cmd->CreateParameter('pid', 3, 1, 10, $id); // adInteger, adParamInput
$cmd->Parameters->Append($param);
$rs = $cmd->Execute();
COM + ADODB 是 Windows 平台 PHP 操作 Access 的「核武級」方案,功能強大但部署依賴較重。現代專案建議遷移至 SQLite 或 MySQL,若必須維護舊系統,請做好版本鎖定與容器化部署。