MDBTools 驱动程序未使用 PHP MS-Access 返回字符串值

MDBTools driver not returning string values with PHP MS-Access

我们有一个 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 文件时,只有 Number 和 Date/Time 字段被 returned(尽管是 String)。文本字段 return 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中的AutoNumber; aDate, aDateTime 是 Date/Time; 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电脑上运行 / schedule脚本,通过odbc连接Access和postgres,传输数据比较好?如果是这样,最好的脚本是什么?

我的解决办法是:反过来。

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

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

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

经过一天的艰苦奋斗,我终于为您的线程主题找到了一个可行的解决方案(MDBTools driver 不返回带有 PHP MS-Access 的字符串值)

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

解法:

而不是使用 PDO Class in manipulating the access db, I recommend using 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”是需要在odbc.ini文件中创建的DSN(Data Source Name)在您的 Ubuntu 服务器中,可以在 /etc 文件夹中找到。在您的 odbc.ini 文件中键入以下 DSN 格式。

DSN格式为:

[我的数据源]

描述 = 我的数据来源

Driver = 我的Driver

服务器名=本地主机

数据库 = MyDatabase/Complete 数据库文件的路径

在我的示例代码中是:

[你的DSN]

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

Driver = MDBTools

服务器名=本地主机

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

^注意(1) Database必须是从根开始的完整目录(eg. /var/www/ ...)

^注意(2) Driver必须是MDBTools

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

旧答案:

This is to answer only your 1st question and the subject of this thread: I think there is nothing wrong with the way you use the MDBTools in your code.

After hours of searching the net. I finally found this one thread that is exactly the same as the problem that I was having(MDBTools driver not returning string values with MSACCESS using PHP running in a linux os). Maybe this only exists on accessing MS ACCESS in PHP which being run in a LINUX os? I don't know.

Luckily for us who faces this very problem, I have seem to find a work around for this.

Instead of using the prepare and execute function of PDO, try to use the query one.

EXAMPLE

Change these lines of code:

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

to this:

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

And then:

In your MSACCESS DB file(.mdb, .accdb), Just change the Field Size of the Text Data Type to 127 or less.

Remember that this work around only works if the values in your Text columns have max. characters of 127 only.

Thus, the Text Datatype must be limited to 127 characters inorder for MDBTools to retrieve the text in PHP.

I don't see this as a solution but rather than a bug discovered. I hope somebody notice this. It would help us a lot. Specially those who will encounter this in the future.