PDO:如何在Linux上访问Microsoft Access文件?

时间:2012-11-20 12:22:56

标签: php linux pdo odbc ms-access-2007

我已经设法使用PDO在Windows上读取Microsoft Access文件(.accdb)的数据但我在使用Linux(CentOS)时遇到了问题。我可以看到安装了模块:

[root@rapid host]# php -m | grep PDO
PDO
PDO_ODBC
[root@rapid host]# php -m | grep odbc
odbc

代码:

<?php
    try{
        $dbhAccess = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=/root/access/data.accdb;Uid=Admin");
    }
    catch(PDOException $e){
        echo $e->getMessage();
        exit();
    }

执行(CLI)PHP文件时出现错误:

[root@rapid host]# php access.php
SQLSTATE[IM002] SQLDriverConnect: 0 [unixODBC][Driver Manager]Data source name not found, and no default driver specified

4 个答案:

答案 0 :(得分:2)

您应该安装MDB驱动程序。

我现在无法尝试,但我认为MDB Tools(特别是ODBC driver)可以做你感兴趣的事情。

答案 1 :(得分:1)

我从未使用过Microsoft Access数据库,但我经常连接到DB2(在IBM AS / 400上)和从Linux(Ubuntu)服务器连接到MS SQL服务器。您的错误似乎表明您没有安装MS Access驱动程序 - 我唯一知道的是:http://www.easysoft.com/products/data_access/odbc-access-driver/index.html

您的错误消息还显示“未找到数据源名称” - 为了让我连接到DB2或MSSQL,我必须向/etc/odbc.ini和/etc/odbcinst.ini添加一些信息。 p>

/etc/odbcinst.ini - 您可以在此处描述在何处查找ODBC的驱动程序。以下是我用于DB2和MSSQL的示例:

[iseries]
Description     = iSeries Access for Linux ODBC Driver
Driver          = /usr/lib/libcwbodbc.so
Setup           = /usr/lib/libcwbodbcs.so
NOTE1           = If using unixODBC 2.2.11 or later and you want the 32 and 64-bit ODBC drivers to share DSN's,
NOTE2           = the following Driver64/Setup64 keywords will provide that support.
Driver64        = /usr/lib/lib64/libcwbodbc.so
Setup64         = /usr/lib/lib64/libcwbodbcs.so
Threading       = 2
DontDLClose     = 1
UsageCount      = 1

# Define where to find the driver for the Free TDS connections.
[freetds]
Description     = MS SQL database access with Free TDS
Driver          = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so
Setup           = /usr/lib/i386-linux-gnu/odbc/libtdsS.so
UsageCount      = 1

[ODBC]
Trace           = no
TraceFile       = /tmp/odbc.log

在最后一节([ODBC])中我当前有Trace = no - 如果你将其更改为Trace = yes,你将在/tmp/odbc.log文件中获得一些有用的调试信息。

/etc/odbc.ini - 您可以在此处定义数据源。以下是我用于DB2和MSSQL的示例:

[primary]
Description             = primary
Driver                  = iseries
System                  = XXX.XXX.XXX.XXX
UserID                  = XXXXXXXXXX
Password                = XXXXXXXXXX
Naming                  = 0
DefaultLibraries        = QGPL
Database                = MYLIB
ConnectionType          = 0
CommitMode              = 2
ExtendedDynamic         = 0
DefaultPkgLibrary       = QGPL
DefaultPackage          = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression    = 1
LibraryView             = 0
AllowUnsupportedChar    = 0
ForceTranslation        = 0
Trace                   = 0

# Define a connection to the MSSQL server.
# The Description can be whatever we want it to be.
# The Driver value must match what we have defined in /etc/odbcinst.ini
# The Database name must be the name of the database this connection will connect to.
# The ServerName is the name we defined in /etc/freetds/freetds.conf
# The TDS_Version should match what we defined in /etc/freetds/freetds.conf
[mssql]
Description             = MSSQL Server
Driver                  = freetds
Database                = MyDatabase
ServerName              = mssql
TDS_Version             = 8.0

我在StackOverflow上看到了一些关于在Linux机器上使用MSFT Access数据库的问题 - 而且似乎没有一个幸福的结局。如果有任何方法可以将数据移植到不同的,更好的支持,数据库系统(如MySQL),我想你会省去一些麻烦。祝你好运!

答案 2 :(得分:1)

您不能将 {Microsoft Access驱动程序(* .mdb,* .accdb)} 用作数据源的一部分,因为Microsoft不为Linux创建MS Access ODBC驱动程序。据我所知,MS Access有2个ODBC驱动程序。 MDB ToolsEasysoft ODBC-Access Driver

如果您安装了任一驱动程序,则可以使用在odbc.ini文件中设置的DSN,也可以使用DSN-Less连接。以下是与MS Access数据库的Easysoft DSN-Less连接的示例

PDO(“odbc:Driver = {Driver = Easysoft ODBC-ACCESS}; Dbq = / root / access / data.accdb”);

有关使用PDO-ODBC连接和获取数据的更多信息可以在Easysoft PHP guide上找到。有一节介绍了PDO-ODBC。

答案 3 :(得分:-1)

对于WINDOWS,这是解决方案。

花费大量时间后,我有了解决方案。

必须安装32位版本的“ AccessDatabaseEngine”。

在以下位置下载32位访问引擎:https://www.microsoft.com/es-es/download/confirmation.aspx?id=13255

并使用命令行运行它:AccessDatabaseEngine.exe / passive

之后,它应该可以工作。