You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu22.04下如何修改pdo_odbc.ini扩展设置为libodbc.so?

问题描述

在离线Ubuntu 22.04主机部署LAMP环境,用于测试odbc-mdbtools配置,目标是让在线服务器能读写MS Access数据库,实现与微软平板的数据交互。操作及遇到的问题如下:

  1. 先后安装unixODBC、odbc-mdbtools,修改php.ini启用pdo-odbc扩展后测试无响应,查看phpinfo发现PHP8.1未自带pdo-odbc,遂执行sudo apt-get install php-odbc安装。
  2. phpinfo显示odbc已存在,但测试脚本连接时报错,提示尝试使用MySQL。
  3. 通过sudoedit修改pdo-odbc.ini,尝试将扩展替换为unixODBC对应的libodbc.so,但测试脚本提示“no driver found”,该文件实际存在于/usr/lib/x86_64-linux-gnu/libodbc.so。
  4. 已尝试卸载重装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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:43:16