Ubuntu22.04下如何修改pdo_odbc.ini扩展设置为libodbc.so?
在离线Ubuntu 22.04主机部署LAMP环境,用于测试odbc-mdbtools配置,目标是让在线服务器能读写MS Access数据库,实现与微软平板的数据交互。操作及遇到的问题如下:
- 先后安装unixODBC、odbc-mdbtools,修改php.ini启用pdo-odbc扩展后测试无响应,查看phpinfo发现PHP8.1未自带pdo-odbc,遂执行
sudo apt-get install php-odbc安装。 - phpinfo显示odbc已存在,但测试脚本连接时报错,提示尝试使用MySQL。
- 通过
sudoedit修改pdo-odbc.ini,尝试将扩展替换为unixODBC对应的libodbc.so,但测试脚本提示“no driver found”,该文件实际存在于/usr/lib/x86_64-linux-gnu/libodbc.so。 - 已尝试卸载重装unixodbc和odbc-mdbtools,仅保留odbc-mdbtools,问题仍未解决,需实现php-pdo与libodbc.so正常配合工作。
1. 确认ODBC驱动配置正确性
检查odbcinst.ini文件(通常位于/etc/odbcinst.ini或/usr/local/etc/odbcinst.ini),确保已添加mdbtools驱动配置,路径需与实际安装位置匹配:
[MDBTools] Description = MDB Tools ODBC Driver Driver = /usr/lib/x86_64-linux-gnu/odbc/libmdbodbc.so Setup = /usr/lib/x86_64-linux-gnu/odbc/libmdbodbc.so FileUsage = 1
若不确定驱动路径,执行find / -name libmdbodbc.so查找。
2. 修正PHP的PDO-ODBC配置
不要手动替换pdo-odbc.ini中的扩展为libodbc.so,PHP的pdo_odbc.so本身基于unixODBC开发,保持配置文件(如/etc/php/8.1/mods-available/pdo_odbc.ini)内容为:
; configuration for php odbc module ; priority=20 extension=pdo_odbc.so
执行以下命令启用扩展并重启服务:
sudo phpenmod pdo_odbc sudo systemctl restart apache2 # 若使用PHP-FPM则执行sudo systemctl restart php8.1-fpm
3. 修正测试脚本的DSN配置
报错“尝试使用mysql”说明PDO连接字符串错误,需指定MDBTools驱动,示例脚本如下:
<?php try { // 方式1:使用配置好的驱动名称 $dsn = "odbc:Driver=MDBTools;DBQ=/path/to/your/access.mdb"; $pdo = new PDO($dsn, '', ''); // Access无用户名密码则留空 // 方式2:直接指定驱动文件路径(若DSN不生效) // $dsn = "odbc:Driver=/usr/lib/x86_64-linux-gnu/odbc/libmdbodbc.so;DBQ=/path/to/your/access.mdb"; // $pdo = new PDO($dsn, '', ''); echo "连接成功"; $pdo = null; } catch(PDOException $e) { die("连接失败: " . $e->getMessage()); } ?>
注意Driver=MDBTools需与odbcinst.ini中的驱动名称一致。
4. 验证unixODBC本身的连接能力
跳过PHP,用unixODBC自带的isql工具测试连接,确认驱动层正常:
isql -v MDBTools /path/to/your/access.mdb
若连接成功,说明ODBC层无问题,问题出在PHP配置或脚本;若失败,先排查驱动路径、文件权限等基础问题。
5. 配置PHP运行时的ODBC环境变量
若PHP运行环境未读取到系统ODBC配置,可在apache2或php-fpm的配置文件中添加环境变量:
- 针对apache2,编辑
/etc/apache2/envvars,添加:export ODBCSYSINI=/etc export ODBCINI=/etc/odbcinst.ini - 针对PHP-FPM,编辑
/etc/php/8.1/fpm/pool.d/www.conf,添加:env[ODBCSYSINI] = /etc env[ODBCINI] = /etc/odbcinst.ini
添加后重启对应服务。
6. 离线安装版本兼容性检查
确保离线安装的php-odbc、unixodbc、odbc-mdbtools版本匹配,Ubuntu22.04默认PHP8.1对应php-odbc版本应为8.1.x,执行以下命令检查版本:
dpkg -l | grep php-odbc dpkg -l | grep unixodbc dpkg -l | grep odbc-mdbtools
若版本不兼容,需重新下载对应版本的离线deb包安装。
内容的提问来源于stack exchange,提问作者Emulite

