0

我们有一个 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中的AutoNumber;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
  }

其实我有2个问题:

  1. 如上所述使用 MDBTools 可能会出现什么问题?

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

4

2 回答 2

2

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

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

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

解决方案:

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

例子:

在您的代码块中

$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]

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

驱动程序 = MDBTools

服务器名 = 本地主机

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

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

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

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

旧答案:

这只是为了回答您的第一个问题和该线程的主题:我认为您在代码中使用 MDBTools 的方式没有任何问题。

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

幸运的是,对于面临这个问题的我们来说,我似乎找到了解决这个问题的方法。

不要使用 PDO 的准备执行功能,而是尝试使用查询一。

例子

更改这些代码行:

$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)中,只需 将文本数据类型的字段大小更改为127更少

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

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

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

于 2016-01-14T10:35:24.767 回答
0

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

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

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

于 2015-12-23T11:03:55.050 回答