Apache2.4+PHP8.2连接SQL Server多报错求助
问题概述
使用Apache 2.4 + PHP 8.2连接SQL Server时遇到一系列问题:
- 调用
mssql_connect()报错:
Fatal error: Uncaught Error: Call to undefined function mssql_connect() in D:\Apache24\htdocs\mcd\configsql.php:6 Stack trace: #0 {main} thrown in D:\Apache24\htdocs\mcd\configsql.php on line 6
- 已在
D:\Apache24\php\php.ini中添加扩展:
extension=php_sqlsrv_82_ts_x64.dll extension=php_pdo_sqlsrv_82_ts_x64.dll
扩展已在phpinfo()中正常显示。
- 改用
sqlsrv_connect(),初始代码:
<?php $myServer = "pcserver"; $myUser = "username"; $myPass = "password"; $myDB = "dbus"; $dbhandle = sqlsrv_connect($myServer, $myUser, $myPass) or die("Couldn't connect to SQL Server on $myServer"); $selected = sqlsrv_select_db($myDB, $dbhandle) or die("Couldn't open database $myDB");
报错:
Fatal error: Uncaught ArgumentCountError: sqlsrv_connect() expects at most 2 arguments, 3 given in D:\Apache24\htdocs\mcd\configsql.php:6 Stack trace: #0 D:\Apache24\htdocs\mcd\configsql.php(6): sqlsrv_connect('pcserver', 'username', 'password') #1 {main} thrown in D:\Apache24\htdocs\mcd\configsql.php on line 6
- 参考官方文档修改代码后仍连接失败,报错为SQLSTATE[08001]、SQL Server Error: 10060(无法连接到服务器)。
排查解决步骤
1. 关于mssql_connect()报错的说明
mssql_connect()是旧版SQL Server扩展函数,PHP 7.0后已被移除,PHP 8.2完全不支持,必须使用sqlsrv_connect()或PDO_SQLSRV扩展,无需再尝试该函数。
2. 修正sqlsrv_connect()参数错误
你第二次调用时传入3个参数,该函数仅接受2个参数:服务器名称 + 连接信息数组,后续参考官方文档修改的参数格式是正确的,此问题已解决。
3. 针对最终连接失败(错误10060)的排查
错误10060为TCP连接超时,说明PHP无法通过网络连接到SQL Server实例,按以下步骤逐一验证:
(1)检查SQL Server网络配置
- 打开SQL Server配置管理器,确保目标实例的TCP/IP协议已启用。
- 进入TCP/IP属性的IP地址标签:
- 对应服务器IP(如192.168.0.1)的“已启用”设为“是”,默认实例需确保TCP端口为1433;命名实例需确认端口配置。
- 若为命名实例,需启动SQL Server Browser服务(负责实例名与端口的映射)。
(2)验证服务器名称/IP格式
- 默认实例:直接用IP或主机名,如
"192.168.0.1" - 命名实例:格式为
"主机名\实例名"或"IP\实例名",如"pcserver\SQLEXPRESS" - 自定义端口:格式为
"IP,端口号",如"192.168.0.1,1434"
(3)测试网络连通性
在运行Apache/PHP的机器上打开命令提示符,执行:
telnet 192.168.0.1 1433
若无法连接,需排查:
- SQL Server所在机器的防火墙是否允许对应端口的入站连接
- 两台机器是否在同一局域网且能互相ping通
- 远程服务器需确认公网IP/端口映射是否正确
(4)验证SQL Server登录权限
- 确保使用的账号(如
sa)已启用,且SQL Server允许SQL Server身份验证(默认可能仅启用Windows身份验证)。 - 在SQL Server Management Studio中用该账号手动登录,确认能访问目标数据库
mydbname。
(5)检查依赖组件兼容性
- 确认
php_sqlsrv扩展为TS(线程安全)版本,且与PHP的x64架构、8.2版本完全匹配。 - 确保服务器已安装ODBC Driver 17 for SQL Server或更高版本(sqlsrv扩展依赖该驱动)。
(6)打印详细错误信息调试
修改代码输出更具体的错误:
<?php $serverName = "192.168.0.1"; // 调整为正确的服务器/实例格式 $connectionInfo = array( "Database" => "mydbname", "UID" => "sa", "PWD" => "password", "ReturnDatesAsStrings" => true ); $conn = sqlsrv_connect($serverName, $connectionInfo); if ($conn) { echo "连接成功<br />"; } else { echo "连接失败<br />"; $errors = sqlsrv_errors(); foreach ($errors as $error) { echo "SQLSTATE: " . $error['SQLSTATE'] . "<br />"; echo "错误代码: " . $error['code'] . "<br />"; echo "错误信息: " . $error['message'] . "<br />"; } } ?>
根据详细错误定位问题,如登录失败会提示“Login failed for user 'sa'”。
内容的提问来源于stack exchange,提问作者Rudi

