【问题标题】:MDBTools driver not returning string values with PHP MS-AccessMDBTools 驱动程序不使用 PHP MS-Access 返回字符串值
【发布时间】:2016-03-17 00:19:14
【问题描述】:

我们有一个由生物识别硬件更新的 MS Access 考勤数据库。所以没有办法替代 MS Access。现在我们需要在我们的 Intranet web 上提供出勤信息,为此我们正在尝试定期读取 Windows XP 计算机上的 MS-Access mdb 文件,并通过 php 写入 postgres 数据库。 PHP - Postgres - Apache 在 Ubuntu 10.04 服务器上运行。 html 页面/报告将从服务器显示。 当使用 MDB 工具从 php 连接到 MS-Access mdb 文件时,仅返回数字和日期/时间字段(尽管是字符串)。文本字段返回 NULL。

PHP代码如下:

$dbName = "/media/winshare/attEngine.mdb";
if (!file_exists($dbName)) 
    die("Could not find database file.");
$dbconn = new PDO("odbc:DRIVER=MDBTools; DBQ=$dbName; Uid=admin; Pwd=pswd;");
if ($dbconn) { 
    echo "mdb connection established.<br />\n";
} else {
    die ("mdb connection could not be established.<br />\n");
}
$qry = "SELECT transactionId, aDate, aDateTime, EmpCode, EmpName, ControllerNum FROM Transactions;"; 
$dbqryprep = $dbconn->prepare($qry);
$dbqryprep->execute();
$result = $dbqryprep->fetchall(PDO::FETCH_ASSOC);

echo "QRY RESULT (from Access):<pre>\n";
var_dump($result);
echo "\n</pre>\n";

这里:transactionId 是 Access 中的自动编号; aDate、aDateTime 是日期/时间; EmpCode 是数字;和 EmpName 和 ControllerNum 是 Access 中的文本字段。

当我们加载 php 时,它给出的结果如下(仅显示前两个数组元素):

mdb connection established.

QRY RESULT (from Access):

array(31986) {
  [0]=>   array(7) {
    ["transactionId"]=>     string(3) "341"
    ["aDate"]=>     string(17) "11/23/13 00:00:00"
    ["aDateTime"]=>     string(17) "11/23/13 13:01:07"
    ["EmpCode"]=>       string(1) "0"
    ["EmpName"]=>       NULL
    ["ControllerNum"]=>     NULL
  }
  [1]=>   array(7) {
    ["transactionId"]=>     string(3) "342"
    ["aDate"]=>     string(17) "11/23/13 00:00:00"
    ["aDateTime"]=>     string(17) "11/23/13 13:01:12"
    ["EmpCode"]=>       string(1) "0"
    ["EmpName"]=>       NULL
    ["ControllerNum"]=>     NULL
  }

其实我有两个问题:

  1. 我在使用上述 MDBTools 时会出现什么问题?

  2. 或者在 Windows 计算机上运行/调度脚本以通过 odbc 连接到 Access 和 postgres,并传输数据更好?如果是这样,最好的脚本是什么?

【问题讨论】:

    标签: php ms-access ubuntu-10.04 mdbtools


    【解决方案1】:

    我的解决方案如下:反过来。

    即我没有在 Linux 系统上运行脚本,而是在 Windows 系统上设置了 Windows 个人 Web 服务器,并在 Windows 上运行 php 文件,通过 ODBC 连接到本地 MS-Access mdb,并在 Linux 服务器上运行 postgres。在此模式下,Access 支持所有复杂的 SQL 查询。

    也许我也可以在 Windows(无 GUI)上安排 php 脚本进行定期更新!

    【讨论】:

      【解决方案2】:

      这是对我原来答案的修改:

      经过几天的艰苦奋斗,我终于为您的主题找到了一个可行的解决方案(MDBTools 驱动程序不使用 PHP MS-Access 返回字符串值

      除了我的旧答案非常限于 Text 数据类型的 127 字段大小之外,这是我对解决方案的新尝试。

      解决方案:

      我建议不要使用PDO Class 来操作访问数据库,而是使用ODBC Functions 来完成这项工作。

      示例:

      在你的代码块中

      $qry = "SELECT transactionId, aDate, aDateTime, EmpCode, EmpName, ControllerNum FROM Transactions"; 
      $dbqryprep = $dbconn->prepare($qry);
      $dbqryprep->execute();
      $result = $dbqryprep->fetchall(PDO::FETCH_ASSOC);
      

      改成

      $connection = odbc_connect("YourDSN","admin","pswd"); 
      $sql = "SELECT transactionId, aDate, aDateTime, EmpCode, EmpName, ControllerNum FROM Transactions";
      $result = odbc_exec($connection,$sql);
      while($row = odbc_fetch_array($result))
      {   echo "<pre>";
          print_r($row);
          echo "</pre>";
      }
      

      YourDSN”是一个 DSN(数据源名称),需要在 Ubuntu 服务器的 odbc.ini 文件中创建,该文件位于/etc 文件夹。在您的 odbc.ini 文件中键入以下 DSN 格式。

      DSN 采用以下格式:

      [我的数据源]

      描述 = 我的数据来源

      司机 = 我的司机

      服务器名称 = 本地主机

      Database = MyDatabase/您的 DB 文件的完整路径

      在我的示例代码中是:

      [您的 DSN]

      Description = 这是为您的访问数据库配置的 DSN

      驱动程序 = MDBTools

      服务器名称 = 本地主机

      数据库 = /var/www/{您的 dns}/{public_html}/.../.../media/winshare/attEngine.mdb

      ^注意(1) 数据库必须是从根目录开始的完整目录(例如/var/www/...)

      ^注意(2) 驱动程序必须是MDBTools

      就是这样!只需弄清楚 DSN 配置就可以了。 您现在终于可以使用其最大字段大小检索访问中的 Text 数据类型。我希望这对每个人都有帮助。如果您有任何澄清,请随时回复或发表评论。

      老答案:

      这只是回答您的第一个问题和本主题 线程:我认为你使用的方式没有错 代码中的 MDBTools。

      经过数小时的网络搜索。我终于找到了这个线程 与我遇到的问题完全相同(MDBTools 驱动程序 不使用在 linux 中运行的 PHP 使用 MSACCESS 返回字符串值 操作系统)。也许这只存在于访问 PHP 中的 MS ACCESS 时 在 LINUX 操作系统中运行?我不知道。

      幸运的是,对于面临这个问题的我们来说,我似乎找到了一份工作 为此。

      不要使用 PDO 的 prepareexecute 功能,试试 使用 query 之一。

      示例

      更改这些代码行:

      $qry = "SELECT transactionId, aDate, aDateTime, EmpCode, EmpName, ControllerNum FROM Transactions;"; 
      $dbqryprep = $dbconn->prepare($qry);
      $dbqryprep->execute();
      $result = $dbqryprep->fetchall(PDO::FETCH_ASSOC);
      

      到这里:

      $qry = "SELECT transactionId, aDate, aDateTime, EmpCode, EmpName, ControllerNum FROM Transactions;"; 
      $result = $dbconn->query($qry)->fetchAll(PDO::FETCH_ASSOC);
      

      然后:

      在您的 MSACCESS DB 文件(.mdb、.accdb)中,只需更改 字段大小 Text 数据类型为 127less

      请记住,这种解决方法仅在您的文本列中的值具有最大值时才有效。仅限 127 个字符。

      因此,文本数据类型必须限制为 127 个字符,以便 MDBTools 在 PHP 中检索文本。

      我不认为这是一个解决方案,而不是发现的错误。一世 希望有人注意到这一点。这对我们有很大帮助。特别是那些 以后会遇到这种情况。

      【讨论】:

      • 感谢您的详细回复。但是我无法控制原始的访问数据库来限制文本列的长度,因为它是由硬件供应商提供的,所以我继续使用基于 Windows 的解决方案!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      相关资源
      最近更新 更多