本质是ODBC驱动注册缺失或名称不匹配,需确认pdo_odbc和odbc扩展均已启用,再将DSN中Driver名改为系统实际注册的“Microsoft Excel Driver (.xls, .xlsx, .xlsm, .xlsb)”,兼容旧环境才需修改注册表。

PHP8环境下使用pdo_odbc连接Excel文件时提示“Driver not found”或PDO构造失败,本质是ODBC驱动注册缺失或名称不匹配,而非PHP扩展未启用。
确认pdo_odbc扩展已正确加载
运行php -m | grep -i odbc,输出中必须包含pdo_odbc和odbc。若无,请先安装扩展:Windows下检查php.ini中是否启用extension=php_pdo_odbc.dll;Linux需执行sudo apt install php-odbc(Debian/Ubuntu)或sudo yum install php-pdo php-odbc(CentOS/RHEL),并重启Web服务。
⚠️ 注意:仅启用pdo_odbc不够,odbc基础扩展也必须存在,否则PDO无法实例化底层连接句柄。
修复Excel ODBC驱动注册名不一致问题
Windows系统中,Office 2010及以后版本安装的Excel驱动在ODBC数据源管理器里显示为“Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)”,但PHP旧代码中常硬编码为Microsoft Excel Driver (*.xls),导致DSN解析失败。
立即学习“PHP免费学习笔记(深入)”;
第一步:按Win+R输入odbcad32.exe打开64位ODBC数据源管理器(若用32位PHP则运行C:\Windows\SysWOW64\odbcad32.exe)→ 切换到“驱动程序”选项卡 → 查看是否存在“Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)”条目。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
第二步:若存在该长名驱动,直接修改PHP中的DSN字符串,将Driver={Microsoft Excel Driver (*.xls)}替换为Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}。这一步可立即生效,无需改注册表。
第三步:若需兼容Office 2003环境(只认*.xls短名),才进入注册表操作。打开regedit → 定位到HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI → 找到子项Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb) → 右键导出为.reg文件 → 用记事本打开该.reg文件,将所有出现的Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)替换为Microsoft Excel Driver (*.xls) → 双击导入注册表 → 返回ODBC管理器确认新驱动已列出。
【关键前提】 修改注册表前必须关闭所有Excel进程和ODBC管理器窗口,否则注册表写入可能被忽略。
验证DSN连接是否可达
方法一:用isql命令行工具测试(Linux/macOS需先装unixODBC):isql -v "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=/path/to/file.xls"。返回+---------------------------------------+即成功。
方法二:Windows下新建文本文件,后缀改为.udl → 双击打开 → “提供程序”页选“Microsoft OLE DB Provider for ODBC Drivers” → “下一步” → “使用连接字符串” → 粘贴你的完整DSN → 点“测试连接”。弹出“测试连接成功”才说明驱动层通了。
方法三:在PHP中临时加一句var_dump(ODBC_CONNECT('DRIVER={...};DBQ=...', '', ''));,非false即表示ODBC层连通——注意这不是PDO连接,仅验证ODBC驱动可用性。


















