PHP8.1配置sqlsrv扩展连接SQL Server2012报未定义函数错误
PHP8.1加载SQLSRV扩展报错
call to undefined function sqlsrv排查方案 这个报错核心原因只有两类:一是SQLSRV系列扩展未被PHP正确加载,二是代码里函数名拼写错误,按以下步骤逐一排查,全部走通即可解决问题:
- 先核对代码函数名拼写
你报错信息里提示未定义的是sqlserv开头的函数,先检查代码:所有SQLSRV扩展提供的函数前缀都是sqlsrv_(注意末尾有字母r),比如连接函数是sqlsrv_connect(),如果漏写r写成sqlserv_connect(),必然触发未定义函数报错,先把所有相关函数名核对修正。 - 核对扩展文件和当前PHP版本的匹配度
你现在用的是PHP8.1.6,必须满足三个匹配条件,缺一个扩展就会加载失败:- 线程安全版本匹配:在web环境输出phpinfo,找到
Thread Safety项,值为enabled就用TS版dll,值为disabled就用NTS版dll,TS版PHP不能混用NTS的扩展文件,反过来也一样 - 系统架构匹配:phpinfo里
Architecture项显示x64就用x64的dll,显示x86就用x86的dll - 编译版本匹配:必须使用专门为PHP8.1编译的sqlsrv、pdo_sqlsrv扩展dll,不能混用PHP7.x、8.0、8.2版本的扩展文件
- 线程安全版本匹配:在web环境输出phpinfo,找到
- 确认修改的是正确的php.ini配置文件
很多人会改错php.ini路径:同样看phpinfo里的Loaded Configuration File项,显示的文件路径才是PHP实际加载的配置文件,必须在这个文件里加那两行扩展配置,改其他位置的php.ini不会生效。配置修改完成后,必须重启对应的运行环境:用Apache/IIS跑web服务就重启web服务,用命令行CLI跑脚本就关闭重开终端,不重启配置不会加载。 - 核对扩展目录配置
打开你实际加载的php.ini,找到extension_dir配置项,值必须指向你存放那两个dll文件的ext目录的绝对路径,比如PHP安装在C:\php81目录下,该项就应该配置为C:\php81\ext,不要写错路径,也不要指向其他版本PHP的ext目录,否则PHP找不到扩展文件。 - 安装必要的依赖驱动
SQLSRV扩展不是单靠两个dll就能运行,必须在系统上安装对应版本的Microsoft ODBC Driver for SQL Server,连接SQL Server 2012需要安装17及以上版本的ODBC驱动,安装时选择和系统匹配的架构版本,装完重启web服务/终端即可。 - 验证扩展加载状态
以上步骤做完后,刷新phpinfo页面,搜索sqlsrv和pdo_sqlsrv,如果能搜到两个扩展对应的信息块,说明扩展加载成功,此时再测试连接即可。如果搜不到扩展信息,直接查看PHP的错误日志,日志里会明确标注扩展加载失败的具体原因(比如找不到依赖、dll版本不匹配、路径错误),根据日志提示针对性修复即可。
内容的提问来源于stack exchange,提问作者Priya Tiwari
相关产品推荐
相关产品推荐

