Docker环境下PHP8.0连接MSSQL Server登录失败求助
PHP 8.0 + ODBC Driver 18 连接MSSQL登录失败问题解决
问题背景
在Docker容器中为PHP 8.0应用集成MSSQL Server,已安装pdo_sqlsrv、sqlsrv及unixodbc扩展,同时部署了ODBC Driver 18用于连接,但出现登录失败错误:
[Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Login failed for user: 'ZXV\user.name'
使用的两种连接代码:
SQLSRV扩展连接代码
$serverName = "22.22.22.99,99999"; $connectionInfo = array( "UID" => $uid, "PWD" => $pwd, "Database" => $database, "TrustServerCertificate" => true, "Authentication" => "SqlPassword" ); /* Connect using SQL Server Authentication. */ $conn = sqlsrv_connect($serverName, $connectionInfo);
PDO SQLSRV连接代码
$conn = new PDO("sqlsrv:server=$serverName;Database=$database;TrustServerCertificate=true;Authentication=SqlPassword", $uid, $pwd); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
相同凭据在PHP 5.6搭配mssql扩展及dblib驱动时可正常连接MSSQL Server。
ODBC Driver 18 for SQL Server 的关键变更
默认强制加密连接
Driver 18将Encrypt参数默认值从Optional改为Required,意味着所有连接必须使用加密。即使设置了TrustServerCertificate=true,如果未明确指定加密模式,仍可能因服务器未配置有效SSL证书导致连接失败。身份验证参数处理更严格
对身份验证类型与用户名格式的匹配校验更严格:- 若使用
Authentication=SqlPassword(SQL Server身份验证),用户名不应包含域前缀(如ZXV\),需使用SQL Server本地用户格式; - 若为Windows域用户,需使用对应的Windows身份验证方式(如
ActiveDirectoryPassword),且Docker容器需配置Kerberos环境支持域身份验证。
- 若使用
弃用旧版兼容参数
部分旧版驱动支持的非标准参数被移除,需使用官方文档指定的标准连接参数。
针对性配置建议
1. 明确指定加密模式
在连接参数中添加Encrypt=Optional(若服务器未配置SSL证书)或Encrypt=Strict(若服务器有有效证书):
- SQLSRV扩展修改后代码
$serverName = "22.22.22.99,99999"; $connectionInfo = array( "UID" => $uid, "PWD" => $pwd, "Database" => $database, "TrustServerCertificate" => true, "Authentication" => "SqlPassword", "Encrypt" => "Optional" // 添加加密模式指定 ); $conn = sqlsrv_connect($serverName, $connectionInfo); - PDO SQLSRV修改后代码
$conn = new PDO("sqlsrv:server=$serverName;Database=$database;TrustServerCertificate=true;Authentication=SqlPassword;Encrypt=Optional", $uid, $pwd); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
2. 匹配身份验证类型与用户名格式
- 如果
ZXV\user.name是SQL Server本地用户:移除域前缀,将$uid设置为user.name; - 如果是Windows域用户:将
Authentication改为ActiveDirectoryPassword,同时在Docker容器中配置Kerberos(需同步域控制器的krb5.conf,配置SPN等),若无需域身份验证,建议改用SQL Server本地用户。
3. 验证ODBC驱动的基础连接能力
在Docker容器内执行以下命令,直接用ODBC工具测试连接,排除PHP扩展的问题:
isql -v -k "DRIVER={ODBC Driver 18 for SQL Server};SERVER=22.22.22.99,99999;UID=$uid;PWD=$pwd;DATABASE=$database;TrustServerCertificate=true;Encrypt=Optional"
若命令执行成功,说明ODBC驱动配置正常,问题出在PHP代码或扩展配置;若失败,需检查驱动安装、服务器IP/端口、用户权限。
4. 检查SQL Server端配置
- 确认目标用户在SQL Server上有登录权限,且已映射到目标数据库的用户;
- 检查SQL Server的防火墙设置,允许Docker容器所在IP地址的连接;
- 确认SQL Server的身份验证模式为混合模式(若使用SQL Server身份验证)。
内容的提问来源于stack exchange,提问作者Aniruddha
相关产品推荐
相关产品推荐

