我们有一个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中的AutoNumber; aDate,aDateTime是日期/时间; EmpCode是Number;和 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
}
其实我有两个问题:
上面使用MDBTools会出现什么问题?
或者,在Windows计算机上运行/安排脚本以通过odbc连接到Access和postgres以及传输数据是否更好?如果是这样,最好的脚本是什么?
答案 0 :(得分:0)
我的解决方案如下:反之亦然。
即。我没有在Linux系统上运行脚本,而是在Windows系统上设置Windows个人Web服务器并在Windows上运行php文件,使用ODBC连接到本地MS-Access mdb,并在Linux服务器上运行postgres。在此模式下,Access支持所有复杂的SQL查询。
可能我也可以在Windows上安排php脚本(没有GUI)进行定期更新!
答案 1 :(得分:0)
这是对原始答案的修改:
经过几天艰难的挣扎,我终于为你的主题找到了一个有效的解决方案( 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>";
}
在哪里&#34; YourDSN &#34;是一个DSN(数据源名称),需要在Ubuntu Server中的 odbc.ini 文件中创建,该文件可以在/ etc文件夹中找到。在odbc.ini文件中键入以下DSN格式。
DSN采用以下格式:
[MyDataSource]
描述=我的数据来源
Driver = MyDriver
ServerName = localhost
Database = MyDatabase / DB FIle的完整路径
我的示例代码中包含以下内容:
[YourDSN]
描述=这是您的访问数据库
的已配置DSNDriver = MDBTools
ServerName = localhost
数据库= / var / www / {你的dns} / {public_html} /.../.../ media / winshare / attEngine.mdb
^注意(1) 数据库 必须是从根开始的完整目录(例如/ var / www /...)
^注意(2) 驱动程序 必须是MDBTools
那就是它!只需弄清楚DSN配置,你就可以了。 您现在可以最终检索访问中具有最大字段大小的Text数据类型。我希望这有助于每个人。如果您有一些说明,请随时回复或发表评论。
OLD ANSWER:
这只是回答你的第一个问题及其主题 thread:我认为你使用它的方式没有错 代码中的MDBTools。
网上搜索了几个小时。我终于找到了这一个帖子 与我遇到的问题完全相同(MDBTools驱动程序 使用在Linux中运行的PHP,不使用MSACCESS返回字符串值 OS)。也许这仅存在于访问PHP中的MS ACCESS时 在LINUX操作系统中运行?我不知道。
幸运的是,面对这个问题的我们,我似乎找到了一份工作 为了这个。
不要使用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数据库文件(.mdb,.accdb)中,只需更改字段大小 文字数据类型为 127 或更少。
请记住,只有Text列中的值具有max时,此解决方法才有效。只有127个字符。
因此,文本数据类型必须限制为127个字符 MDBTools用PHP检索文本。
我不认为这是一种解决方案,而不是发现的错误。一世 希望有人注意到这一点。这对我们很有帮助。特别是那些人 将来会遇到这种情况。