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字段(尽管是String)。Text字段返回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中的Text字段。

当我们加载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,并传输数据?如果是这样的话,最好的脚本是什么?

这是对我最初答案的编辑:

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

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

解决方案:

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

示例:

在您的代码块中

$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/etc文件夹中找到。在odbc.ini文件中键入下面的DSN格式。

DSN的格式如下:

[MyDataSource]

描述=我的数据的来源

Driver=MyDriver

ServerName=localhost

数据库=我的数据库/数据库FIle 的完整路径

在我的示例代码中,哪个是:

[YourDSN]

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

驱动程序=MDBTools

ServerName=localhost

数据库=/var/www/{your-dns}/{public_html}/…//media/winshare/attEngine.mdb

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

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

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

旧答案:

这只是回答你的第一个问题和这个主题thread:我认为你使用代码中的MDBTools

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

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

不要使用PDO的prepareexecute功能,请尝试使用查询

示例

更改这些代码行:

$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数据库文件(.mdb、.accdb)中,只需更改字段大小文本数据类型的127小于

请记住,只有当Text列中的值最多只能包含127个字符时,这种变通方法才有效

因此,为了MDBTools来检索PHP中的文本。

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

我的解决方案如下:扭转局面。

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

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