我已经设法使用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
您应该安装MDB驱动程序。
我现在无法尝试,但是我认为MDB Tools(特别是ODBC driver)可以完成您感兴趣的事情。
我从未使用过Microsoft Access数据库,但是我确实定期从Linux(Ubuntu)服务器连接到DB2(在IBM AS / 400上)和MS SQL服务器。您的错误似乎表明您没有安装MS Access驱动程序-我知道的唯一驱动程序是:http://www.easysoft.com/products/data_access/odbc-access-driver/index.html
您的错误消息还说“找不到数据源名称”-为了使我连接到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
在最后一节([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),我认为您会省去一些麻烦。祝你好运!
您不能使用{Microsoft Access Driver(* .mdb,* .accdb)}作为数据源的一部分,因为Microsoft并未为Linux制作MS Access ODBC驱动程序。据我所知,MS Access有2个ODBC驱动程序。 MDB Tools和Easysoft 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。
花费大量时间后,我有了解决方案。
必须安装32位版本的“ AccessDatabaseEngine”。
在以下位置下载32位访问引擎:https://www.microsoft.com/es-es/download/confirmation.aspx?id=13255
并使用命令行运行它:AccessDatabaseEngine.exe / passive
此后,它应该起作用。