PHP连接SQL Server 2008/2019失败:SSPI上下文生成错误求助
PHP连接SQL Server时SSPI上下文生成失败的解决办法
核心问题定位
你的代码里重复赋值覆盖了$connectionInfo变量,原本设置的数据库名称、账号密码、身份验证方式等关键参数被清空,只保留了字符集配置,这是引发Cannot generate SSPI context(无法生成SSPI上下文)错误的直接原因。
分步解决
修复连接参数赋值错误
把所有必要的连接参数合并到同一个数组中,不要重复赋值覆盖。根据你使用的身份验证方式二选一:SQL Server身份验证(推荐,避免SSPI配置问题)
移除Trusted Connection配置,确保UID(用户名)和PWD(密码)正确:$connectionInfo = [ "Database" => "XXX", "UID" => "XX", "PWD" => "XX", "CharacterSet" => "UTF-8" ];Windows身份验证(Trusted Connection)
无需填写UID和PWD,但要确保运行PHP的进程(如IIS应用池账户、Apache运行账户)拥有SQL Server的访问权限:$connectionInfo = [ "Database" => "XXX", "Trusted Connection" => "yes", "CharacterSet" => "UTF-8" ];
验证服务器地址格式
确保$serverName格式正确:- 带端口:
"服务器名, 端口号"(如"WIN-SERVER, 1433") - 带实例名:
"服务器名\实例名"(如"PANDORAS-BOX\EXP_2008R2")
- 带端口:
排查SSPI相关配置(仅Windows身份验证时需要)
- 检查SQL Server服务账户的SPN(服务主体名称)是否注册,可通过命令
setspn -L <SQL服务账户名>查看 - 确保运行PHP的账户在SQL Server中被授予登录权限
- 检查Kerberos协议是否正常,避免NTLM身份验证失败
- 检查SQL Server服务账户的SPN(服务主体名称)是否注册,可通过命令
确认驱动与版本兼容
确保已正确安装ODBC Driver 17 for SQL Server,且该驱动支持你的SQL Server版本(SQL Server 2008需确认驱动兼容性,必要时可尝试降级驱动版本)
修正后的完整代码示例(SQL Server身份验证)
<?php // 替换为实际的服务器地址 $serverName = "YourServerName, 1433"; $connectionInfo = [ "Database" => "XXX", "UID" => "XX", "PWD" => "XX", "CharacterSet" => "UTF-8" ]; $conn = sqlsrv_connect($serverName, $connectionInfo); if ($conn) { echo "连接成功<br />"; } else { echo "连接失败<br />"; die(print_r(sqlsrv_errors(), true)); } $sql = "SELECT Account_Id, Account_No FROM Savings_Account WHERE IPKS IS NULL"; $params = []; $options = ["Scrollable" => SQLSRV_CURSOR_KEYSET]; $stmt = sqlsrv_query($conn, $sql, $params, $options); if ($stmt) { while ($row = sqlsrv_fetch_array($stmt)) { echo json_encode($row) . "<br />"; } } else { die(print_r(sqlsrv_errors(), true)); } sqlsrv_close($conn); ?>
内容的提问来源于stack exchange,提问作者Captain Sam
相关产品推荐
相关产品推荐

