本质是缺少微软odbc驱动,而非php扩展未安装;需先安装odbc driver 17/18并配置path,再验证php.ini启用pdo_sqlsrv,最后确保dsn中driver参数与odbcad32显示名称完全一致。

PHP报错“找不到驱动程序”,本质是缺ODBC驱动,不是PHP扩展没装好
绝大多数人卡在这一步:反复检查php.ini里写了extension=pdo_sqlsrv、DLL也放进ext目录了,php -m却看不到模块——问题根本不在PHP侧。PDO或sqlsrv扩展只是“翻译员”,它必须依赖微软的ODBC Driver for SQL Server才能真正说话。Windows下这个驱动不装,或者PATH没配对,扩展加载成功也会在运行时失败。
Windows下必须安装ODBC Driver 17(或18),且PATH要包含Binn路径
别用旧版SQL Server Native Client,它已弃用;也别信第三方打包的“一键安装包”。必须从微软官方下载ODBC Driver 17 for SQL Server(2026年主流稳定版)或ODBC Driver 18(支持TLS 1.3和Azure AD登录)。安装完成后,确认以下两点:
-
C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn(Driver 17)或180\Tools\Binn(Driver 18)这个路径已加入系统环境变量PATH - 打开命令行执行
odbcad32.exe,能正常启动ODBC数据源管理器,且在“驱动程序”页签里能看到ODBC Driver 17 for SQL Server条目 - 如果用的是IIS或Windows服务方式运行PHP,需重启整个服务(不只是Web服务器),否则PATH变更不生效
Linux下没unixODBC和微软ODBC驱动,pdo_sqlsrv编译必失败
在Ubuntu/Debian或CentOS上,光靠pecl install pdo_sqlsrv会直接报错“unable to find unixODBC”或“sql.h not found”。你得先装底层依赖:
- Ubuntu/Debian:
sudo apt-get install unixodbc-dev odbcinst1debian2 - CentOS/RHEL:
sudo yum install unixODBC-devel(或dnf install unixODBC-devel) - 再按微软文档安装
msodbcsql17(Driver 17)或msodbcsql18(Driver 18)deb/rpm包,不是源码编译 - 验证:
odbcinst -j输出配置路径,odbcinst -j | grep "Driver" | xargs ls应能列出libmsodbcsql-17.so或类似文件
pdo_sqlsrv连接时仍报“driver not found”,检查DSN写法是否带driver=
即使ODBC驱动和PHP扩展都到位,new PDO()构造时若DSN写成sqlsrv:server=...,某些PHP版本(尤其8.2+)会因PDO未注册driver而静默失败。安全写法是显式声明driver:
$dsn = 'sqlsrv:server=localhost;Database=testdb;driver={ODBC Driver 17 for SQL Server};';
注意大括号和空格——driver={ODBC Driver 17 for SQL Server}必须完全匹配odbcad32里显示的驱动名称(区分大小写、含空格)。Windows下可省略driver参数,但Linux下强烈建议带上,避免unixODBC查表失败。
php.ini,却漏掉odbcad32.exe里根本没那个驱动条目。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











