【问题标题】:Connect to MS Access remote .mdb file from php on linux从 linux 上的 php 连接到 MS Access 远程 .mdb 文件
【发布时间】:2011-08-29 16:41:51
【问题描述】:

我已经在互联网上挖掘了几天,阅读了非常古老的信息,这导致了非常古老且不存在的网站,但我仍然明白,实现我的目标需要什么。

  1. 我们在运行 WindowsXP 的服务器上有一个 file.mdb,所以我需要将它添加到 ODBC 数据源。我通过简单的步骤做到这一点,以“系统 DSN”结束,允许访问该 .mdb 文件
  2. 我需要在同一台服务器上安装某种 ODBC 网桥,这将允许我创建到该服务器的远程连接,使该网桥连接到服务器 ODBC DSN,并查询我的东西(找不到任何免费的 ODBC桥)
  3. 在 UNIX (FreeBSD) 机器上,我需要安装 unixODBC 和 php5-odbc 包,以便连接到 ODBC(已安装)
  4. 要连接到远程 ODBC 并使用 MS Access db 驱动程序,我需要有一个用于 unixODBC 的驱动程序,在 .so 文件中,它位于 UNIX 机器内(找不到任何免费的 MS Access 驱动程序)
  5. 使用 PHP odbc_connect(DSN,user,password) 连接到该服务器,在 DSN 中我需要提供一些我需要使用的连接信息和驱动程序(MS Access 驱动程序)。

纠正我,如果我弄错了,请给我更多建议,如何实现这样的连接。

【问题讨论】:

  • 为什么要使用 Jet/ACE 数据存储?
  • 有Win软件,就是生成那些mdb文件,非常严重的OLD软件,我需要创建数据集成能力——使用数据到报表中。
  • 也许应该创建一个软件组件以在 Windows 上运行,在数据离开 Windows 环境之前将 MDB 转换为更便携的格式。
  • 遗憾的是,我的资源无法实现。
  • 但是,在 Windows 上运行的软件组件可以像使用 DAO 将数据表写入一堆 CSV 文件的 VBScript 一样简单。

标签: php ms-access odbc jet unixodbc


【解决方案1】:

终于找到了解决办法。

  1. 在Win服务器上设置FreeSSHd,配置连接账号,设置目录为1,你需要
  2. 在 unix 服务器 sshfs 上设置
  3. 使用 .mdb 文件装载 Win 服务器目录

    sshfs {user}@:/ {unix 挂载点} -o workaround=rename,allow_other

  4. 在 unix 服务器上设置 mdbtools

所以,我使用了文档中的默认 PHP 代码并编写了这个 PHP 脚本:

$rows = $cols = array();
if (($handle = popen('/usr/bin/mdb-export {unix mount point}/{file}.mdb {table} 2>&1', 'r')) !== FALSE) {
    while (($data = fgetcsv($handle, 0, ",")) !== FALSE) {
        $num = count($data);
        if ($row == 1) { for ($c=0; $c < $num; $c++) { $cols[] = $data[$c]; } }
        else { for ($c=0; $c < $num; $c++) { $rows[$row][$cols[$c]] = $data[$c]; } }
        $row++;
    }
    pclose($handle);
}
print_r($rows);
  • /usr/bin/mdb-export 的路径 应该是您的 mdb-export 文件的路径(如果找不到您的文件,请使用 find / -name "mdb-export")。
  • 挂载点{unix mount point}应该是一个空文件夹(我用的是/usr/home/remotemdb
  • {table} 应该是 mdb 文件中的表名。使用命令mdb-tables {unix mount point}/&lt;file&gt;.mdb 查询 mdb 文件中所有可能的表

不需要驱动程序、配置或其他东西,只需简单的 mdbtools 和对文件的访问,在这种情况下,通过 ssh 远程连接实现。在你想要的情况下,你可以安装 fuse 包,自动挂载远程目录,但这是另一个问题。

希望有人对此有所帮助。

【讨论】:

    【解决方案2】:

    您没有连接到“服务器 dsn”。 DSN 只是本地的东西。它们根本不会暴露给远程连接。如果您希望机器连接到数据库,则需要在该机器上配置 DSN - 您将无法使用其他地方指定的 DSN。

    对于 PHP ODBC,应该是

    $connection = odbc_connect("Driver={Microsoft Access Driver (*.mdb)};Dbq=/network/path/to/your/access/database.mdb", $user, $password);
    

    【讨论】:

    • 问题是,我需要什么软件(首选免费软件)才能连接到本地 DSN?
    【解决方案3】:

    您是正确的,因为您需要 ODBC 到 ODBC 桥。

    OpenLInk,我们指的是Multi-tier ODBC to ODBC Bridge...

    这是多层,因为它具有如下客户端/服务器架构--

    Linux 客户端 -- ODBC 应用程序 OpenLink 通用 ODBC 驱动程序

    Windows 服务器 -- 32bit OpenLink 请求代理 32 位 OpenLink ODBC 代理 32 位 Microsoft Access ODBC 驱动程序(带有预配置的 DSN) Microsoft Access 数据库文件。

    【讨论】:

    • 这也是商业广告。我想要一些免费软件桥,因为我不处理商业内容。顺便说一句,那个软件已经过时了!只有旧的 FreeBSD 5.4 可用,目前使用的是第 8 版。来吧,你想让我为过时的产品买单吗? :( 但是,感谢您的信息...
    【解决方案4】:

    它是商业的,所以可能不感兴趣,但 Easysoft 有一个用于 Access 的 ODBC 驱动程序,可在大多数 *nix 上使用。不需要桥梁。目前没有基于 FreeBSD 的构建,但如果您有兴趣,我可以在周一为您构建一个。

    有一些开源 MDB 工具可能足以满足您的需求,但缺少很多功能。

    Easysoft Access ODBC Driver

    MDB tools

    【讨论】:

    • 那是完全一样的,正如我在上面的回答中提到的......但是谢谢你的提议!
    【解决方案5】:

    将 PDO 与 MDBTools 一起使用:

    安装:

    apt-get 安装 libodbc1

    apt-get install libmdbodbc1

    apt-get 安装 php5-odbc

    (重启apache)

    示例:

    $query = 'SELECT * FROM Table';
    $mdb_file = 'file.mdb';
    $driver = 'MDBTools';
    $dataSourceName = "odbc:Driver=$driver;DBQ=$mdb_file;Uid=user;Pwd=pass;";
    $connection = new \PDO($dataSourceName);
    $result = $connection->query($query)->fetchAll(\PDO::FETCH_ASSOC);
    print_r($result);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-12
      • 2020-07-05
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      相关资源
      最近更新 更多