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

Php PDO:如何在Linux上访问Microsoft access文件?,php,linux,pdo,odbc,ms-access-2007,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 代码: 我从未使用过Microsoft Access数据库,但我经常从Linux(Ubuntu)服务器连接到DB2(在IBM AS/400

我已经使用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
代码:


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

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

/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
[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
在最后一节([ODBC])中,我当前的Trace=no-如果将其更改为Trace=yes,您将在/tmp/ODBC.log文件中获得一些有用的调试信息

/etc/odbc.ini-这是定义数据源的地方。下面是我用于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
[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),我想你会省去一些麻烦。祝你好运

您应该安装MDB驱动程序


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

您不能将{Microsoft Access Driver(*.mdb,*.accdb)}作为数据源的一部分,因为Microsoft没有为Linux制作MS Access ODBC驱动程序。据我所知,MS Access有2个ODBC驱动程序。这个和那个

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

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


有关使用PDO-ODBC连接和获取数据的更多信息,请参见下面的一节,该节介绍了PDO-ODBC。

对于WINDOWS,这就是解决方案

在投入了大量时间后,我找到了解决方案

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

在以下位置下载32位访问引擎:

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


在这之后,它应该可以工作。

对于任何其他有问题的人,连接上述语法在最新版本上不起作用-请使用
$filename=“/path/to/database.mdb”
$pdo=new-pdo(“odbc:DRIVER={Easysoft odbc-ACCESS};MDBFILE={$filename};”请注意,驱动程序和MDBFILE都是块帽,DBQ现在是MDBFILEHi,事实上,它与Easysoft ODBC-ACCESS驱动程序一起工作。但它不是免费的,而且相当昂贵。除了MDB工具(SQL支持非常有限)之外,您还知道Linux的ODBC访问驱动程序吗?找到了一个替代商业ODBC访问驱动程序的好方法:MDB SQLite“您不能使用{Microsoft Access Driver(*.MDB,*.accdb)}”。对不起,你错了。我在Linux上使用MDBTools,只要您已经使用该名称配置了ODBC驱动程序(查看/etc/odbcinst.ini),您就可以在连接字符串中使用该名称。另一件事是让一个没有DSN的连接正常工作,这是我还没能做到的。这个答案对于Windows机器来说很好,但是这个问题是专门针对Linux环境的,所以它没有帮助。