我们有一个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
}
实际上我有两个问题:
在我使用MDBTools的过程中,会出现什么问题?
还是最好在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的prepare和execute功能,请尝试使用查询。
示例
更改这些代码行:
$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脚本进行定期更新!