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

时间:2015-12-11 06:41:07

标签: php ms-access ubuntu-10.04 mdbtools

我们有一个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
  }

其实我有两个问题:

  1. 上面使用MDBTools会出现什么问题?

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

2 个答案:

答案 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]

描述=这是您的访问数据库

的已配置DSN

Driver = 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检索文本。

     

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