You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 的关键变更

  1. 默认强制加密连接
    Driver 18将Encrypt参数默认值从Optional改为Required,意味着所有连接必须使用加密。即使设置了TrustServerCertificate=true,如果未明确指定加密模式,仍可能因服务器未配置有效SSL证书导致连接失败。

  2. 身份验证参数处理更严格
    对身份验证类型与用户名格式的匹配校验更严格:

    • 若使用Authentication=SqlPassword(SQL Server身份验证),用户名不应包含域前缀(如ZXV\),需使用SQL Server本地用户格式;
    • 若为Windows域用户,需使用对应的Windows身份验证方式(如ActiveDirectoryPassword),且Docker容器需配置Kerberos环境支持域身份验证。
  3. 弃用旧版兼容参数
    部分旧版驱动支持的非标准参数被移除,需使用官方文档指定的标准连接参数。


针对性配置建议

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:37:09