php升级后mssql连接老是出问题,折腾半天还没搞定数据库那块儿
- 问答
- 2026-01-05 01:06:52
- 21
朋友,你这问题可太常见了,你不是一个人在战斗,PHP一升级,尤其是从PHP 5.x跳到7.x,或者从7.x跳到8.x,之前跑得好好的MSSQL连接突然就罢工,这事儿折腾过的人都能写一本血泪史,你别急,咱们一步步来捋,问题大概率就出在几个关键点上。
最最最核心的问题,PHP的扩展(Extension)换掉了,根据PHP官方社区的广泛讨论,在PHP 7.0及以后的时代,一个叫mssql的旧扩展被彻底废弃了,这个扩展依赖于FreeTDS库,在PHP 5的时代是连接MSSQL的主力,但升级后,它不管用了,现在官方主推的是由微软自己维护的两个扩展:sqlsrv 和 pdo_sqlsrv。

你第一个要检查的就是:你的PHP环境里,现在装的是哪个扩展? 你打开你的php.ini配置文件,用记事本或任何文本编辑器搜一下,看看有没有类似这样的行:
extension=php_mssql.dll(这个就是已经被淘汰的旧扩展,如果有,问题很可能就在这)extension=php_sqlsrv_82_ts_x64.dll(这是新的sqlsrv扩展,名字里的数字会随PHP版本变化)extension=php_pdo_sqlsrv_82_ts_x64.dll(这是新的pdo_sqlsrv扩展,用于PDO连接)
如果你发现启用的还是php_mssql,或者两个新的扩展一个都没有,那方向就明确了:你需要去下载并安装新的扩展。

接下来是第二个大坑,扩展的版本和你的PHP版本对不上,这个特别容易搞错,根据很多开发者在Stack Overflow等技术论坛上的反馈,下载扩展时不能瞎下,必须像配钥匙一样,严丝合缝地匹配你的PHP环境,你需要确认以下几个信息:
- PHP版本:是8.0,8.1,还是8.2,8.3?差一个小版本都不行。
- 线程安全(Thread Safe)与否:你的PHP是TS (Thread Safe) 还是 NTS (Non-Thread Safe) 的?这个在你当初下载PHP解释器的时候就决定了,如果和IIS搭配,通常用NTS;和Apache搭配,可能要用TS,你可以创建一个php文件,里面写
<?php phpinfo(); ?>,然后在浏览器里访问这个页面,搜索“Thread Safety”这一项,就能看到是Enabled(TS)还是Disabled(NTS)。 - 系统架构:你的服务器或电脑操作系统是 x86 (32位) 还是 x64 (64位)?同样可以在
phpinfo()页面里的“Architecture”一项看到。
确认了这三点后,你去微软官方的GitHub页面下载对应的DLL文件,地址是:github.com/Microsoft/msphpsql/releases,把下载下来的php_sqlsrv和php_pdo_sqlsrv的DLL文件,放到你PHP安装目录下的ext文件夹里。

回到php.ini文件,把之前关于mssql的扩展行用分号注释掉(或者直接删除),再新增两行:
extension=php_sqlsrv_你的版本号.dll
extension=php_pdo_sqlsrv_你的版本号.dll
保存后,重启你的Web服务器(比如Apache或Nginx)或PHP-FPM服务。
第三个常见问题是,连接代码本身没改,即使你装对了扩展,如果你的代码还用的是旧的mssql_connect()这类函数,那肯定报错,因为这些函数随着扩展一起被移除了,你必须改用新的函数。
- 如果你选择使用sqlsrv扩展,连接代码大概是这样的:
$serverName = "你的服务器名\实例名, 端口号"; // "localhost\SQLEXPRESS, 1433" $connectionInfo = array( "Database"=>"你的数据库名", "UID"=>"用户名", "PWD"=>"密码"); $conn = sqlsrv_connect( $serverName, $connectionInfo );
- 如果你选择使用更通用的PDO方式,代码是这样的:
$server = "你的服务器名\实例名, 端口号"; $database = "你的数据库名"; $username = "用户名"; $password = "密码"; try { $conn = new PDO("sqlsrv:Server=$server;Database=$database", $username, $password); } catch (PDOException $e) { die("连接失败: " . $e->getMessage()); }
还有一些零零碎碎的可能,根据一些服务器管理员的经验分享,防火墙是否阻挡了新的连接?SQL Server的TCP/IP协议是否在配置管理器中启用了?SQL Server本身是否允许远程连接?这些虽然是老生常谈,但在新环境下也值得再检查一遍。
解决这个问题的路线图就是:停用旧扩展 -> 下载并启用正确版本的新扩展 -> 修改代码使用新的连接函数,按照这个顺序排查,百分之九十九能搞定,别灰心,这几乎是每个从老项目升级PHP的开发者必经的一道坎,踩过去就好了。
本文由盈壮于2026-01-05发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/74650.html
