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

PHP 結合 Access 跨資料庫查詢實作

     編輯:PHP 綜合知識

應用場景

需在同一查詢中關聯不同 Access 資料庫檔案 (`.mdb` / `.accdb`) 的資料表,Access SQL 支援特殊語法實現跨庫 JOIN。

核心語法

SELECT * 
FROM 裝材類型 AS a 
INNER JOIN [;database=路徑/檔案名.accdb].裝材 AS b 
ON a.BH = b.LXBH

語法解析

元素說明
[;database=...]中括號包裹,database 關鍵字指定外部資料庫路徑
路徑相對路徑 (相對當前連線資料庫) 或絕對路徑
pwd=密碼可選,外部資料庫有密碼時需提供
資料表前綴外部資料庫.資料表名 格式

PHP 完整實作 (PDO_ODBC)

<?php
try {
    // 主資料庫連線
    $pdo = new PDO(
        "odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C:/data/main.accdb;",
        "", ""
    );
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // 跨庫查詢
    $externalDb = "C:/data/materials.accdb";
    $sql = "
        SELECT a.類型名稱, b.材料名稱, b.規格
        FROM 裝材類型 AS a
        INNER JOIN [;database=$externalDb].裝材 AS b
        ON a.編號 = b.類型編號
        WHERE a.啟用 = 1
    ";
    
    $stmt = $pdo->query($sql);
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    foreach ($results as $row) {
        echo "{$row['類型名稱']} - {$row['材料名稱']} - {$row['規格']}\n";
    }
    
} catch (PDOException $e) {
    error_log("Access 查詢失敗: " . $e->getMessage());
    echo "查詢錯誤,請檢查日誌";
}

注意事項與限制

  • ✅ 僅支援 Access (Jet/ACE) 引擎,不適用 MySQL/PostgreSQL/SQL Server
  • ✅ 外部資料庫需可被當前進程讀取 (權限、網路路徑需映射磁碟機)
  • ⚠️ 跨庫 JOIN 效能較差,大量資料建議匯入同一資料庫或使用 ETL 同步
  • ⚠️ Access 並發連線限制 (255),高併發場景不適用
  • ⚠️ 64 位元 PHP 需安裝 64 位元 Access Database Engine

替代方案

1. 同步匯入同一資料庫 (推薦)

// 定時任務將外部資料表同步至主資料庫
$external = new PDO("odbc:...;Dbq=$externalDb");
$main = new PDO("odbc:...;Dbq=$mainDb");

$data = $external->query("SELECT * FROM 裝材")->fetchAll();
$stmt = $main->prepare("INSERT INTO 裝材同步 (欄位...) VALUES (?, ?, ...)");
foreach ($data as $row) $stmt->execute(array_values($row));

2. 聯邦查詢

SQL Server / PostgreSQL / MySQL 8.0+ 支援 Foreign Data Wrapper / Linked Server 進行標準跨實例查詢。

3. 應用層 JOIN

// 分別查詢再 PHP 端合併 (小資料量適用)
$types = $pdo1->query("SELECT * FROM 裝材類型")->fetchAll(PDO::FETCH_KEY_PAIR);
$materials = $pdo2->query("SELECT * FROM 裝材")->fetchAll();
foreach ($materials as &$m) $m['類型名稱'] = $types[$m['類型編號']] ?? '未知';

Access 跨庫查詢是舊系統維護時的實用技巧,新架構設計應避免跨檔案資料庫依賴,採用集中式資料庫或微服務架構。

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