Mac os X下 php7.0.8读取微软access数据库记录

2016-06-26 10:35:00
hainuo
原创 1487
摘要:Mac os X下 php7.0.8使用unixodbc和mdbtools 读取微软access数据库记录
1. 查阅手册发现手册如下配置使用pdo 1.1. 确认php7 brew安装方式是使用了unixodbc组件 验证方法`php -i | grep unixodbc` 结果如下 ``` -> % php -i | grep unixodbc Configure Command => './configure' '--prefix=/usr/local/Cellar/php70/7.0.8' '--localstatedir=/usr/local/var' '--sysconfdir=/usr/local/etc/php/7.0' '--with-config-file-path=/usr/local/etc/php/7.0' '--with-config-file-scan-dir=/usr/local/etc/php/7.0/conf.d' '--mandir=/usr/local/Cellar/php70/7.0.8/share/man' '--enable-bcmath' '--enable-calendar' '--enable-dba' '--enable-exif' '--enable-ftp' '--enable-gd-native-ttf' '--enable-mbregex' '--enable-mbstring' '--enable-shmop' '--enable-soap' '--enable-sockets' '--enable-sysvmsg' '--enable-sysvsem' '--enable-sysvshm' '--enable-wddx' '--enable-zip' '--with-freetype-dir=/usr/local/opt/freetype' '--with-gd' '--with-gettext=/usr/local/opt/gettext' '--with-iconv-dir=/usr' '--with-icu-dir=/usr/local/opt/icu4c' '--with-jpeg-dir=/usr/local/opt/jpeg' '--with-kerberos=/usr' '--with-libedit' '--with-mhash' '--with-ndbm=/usr' '--with-png-dir=/usr/local/opt/libpng' '--with-xmlrpc' '--with-zlib=/usr' '--with-readline=/usr/local/opt/readline' '--without-gmp' '--without-snmp' '--with-libxml-dir=/usr/local/opt/libxml2' '--with-pdo-odbc=unixODBC,/usr/local/opt/unixodbc' '--with-unixODBC=/usr/local/opt/unixodbc' '--with-apxs2=/usr/sbin/apxs' '--libexecdir=/usr/local/Cellar/php70/7.0.8/libexec' '--with-bz2=/usr' '--disable-debug' '--with-openssl=/usr/local/opt/openssl' '--enable-fpm' '--with-fpm-user=_www' '--with-fpm-group=_www' '--with-curl' '--with-xsl=/usr' '--with-ldap' '--with-ldap-sasl=/usr' '--with-mysql-sock=/tmp/mysql.sock' '--with-mysqli=mysqlnd' '--with-mysql=mysqlnd' '--with-pdo-mysql=mysqlnd' '--disable-opcache' '--enable-pcntl' '--without-pear' '--enable-dtrace' '--disable-phpdbg' '--enable-zend-signals' ODBC_INCLUDE => -I/usr/local/opt/unixodbc/include ODBC_LFLAGS => -L/usr/local/opt/unixodbc/lib ``` 1.2. 按照手册说明 直接调用pdo方法出错 报错代码`PDOException: SQLSTATE[01000] SQLDriverConnect: 0 [unixODBC][Driver Manager]Can't open lib 'Microsoft Access Driver (*.mdb)' ` 1.3 更换`odbc_connect`方式,错误跟pdo的报错没什么两样 2. 继续查资料, 2.1. 进入www.unixodbc.org, 2.2. 下载easysoft的odbc_access组件没有下载下来 2.3. 邮箱一直没有收到邮件,放弃 3. 继续查资料 3.1. 在 stackoverflow上发现一个工具叫做mdbtools `brew install mdbtools`安装成功 3.2. 使用命令 `mdb_tables main.mdb` 可以直接查看`main.mdb`的数据表 4. 发现两个工具 `odbc_config` 和 `odbcinst`,继续查看unixodbc相关资料,发现要先使用`odbcinst`安装数据源. 5. 找到比较可靠地文章 [在Linux下实现对Microsoft Access Database(.mdb)查询访问](http://blog.path8.net/archives/3445.html) 5.1. 参照文章创建template.file ``` [MDBToolsODBC] Description = MDB Tools ODBC drivers Driver = /usr/local/opt/mdbtools/lib/libmdb.dylib Setup = FileUsage = 1 CPTimeout = CPReuse = ``` 然后使用命令`odbcinst -i -d -f template.file`安装 安装成功。 然后写自己的datasource,位置是~/.odbc.ini ``` [course] Description = Microsoft Access Database of course Driver = MDBToolsODBC Database = /Users/fengliu/Downloads/main.mdb Servername = localhost UserName = Password = port = 5432 ``` 5.2. 于是我在PHP中做如下修改 ``` $db=new PDO('odbc:course,'',"tt1qaz\\]'/"); ``` 这次不报lib找不到的错了,开始报 ``` PDOException: SQLSTATE[IM004] SQLDriverConnect: 0 [unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed ``` 问题处理到这里,就不是读取不到的问题了。看报错信息是sql分配句柄的错误。 稍后解决的话继续 补充本日志。 #20160627 今天终于收到了easysoft的邮件,但是下载odbc access driver 发现没有支持mac的版本,故不再测试,在linux下理论上是可以用的因为他提供了多个版本的linux 其中大家通用的ubuntu的系统是绝对支持的。 ps:吐槽下easysoft官方的邮件系统,应该是人工审核发布的,不然为啥我等了两天。so,用这个东西要有耐心,毕竟几遍通过后你也只有14天的试用时间,所以不如直接打电话购买授权吧。授权费599法郎,自行斟酌。