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

使用Doctrine连接MSSQL Server v11时遭遇登录失败异常求助

Doctrine连接SQL Server 2012登录失败问题排查与解决

问题场景

尝试使用Doctrine ORM连接版本为11.0.7001.0(即SQL Server 2012)的数据库,采用SQL Server已配置的SQL Authentication用户,实现代码如下:

$modelPath = __DIR__."/../model";
$config = ORMSetup::createAttributeMetadataConfiguration(
    paths: array($modelPath),
    isDevMode: true,
);

$conn = array(
    'driver'   => "pdo_sqlsrv",
    'host'     => "sqlserver1",
    'user'     => "myUser",
    'password' => "fancyPwdHere123",
    'dbname'   => "testDatabase",
);

$entityManager = EntityManager::create($conn, $config);

执行后抛出如下错误:

PHP Fatal error:  Uncaught PDOException: SQLSTATE[28000]: 
  [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Login failed for user 'myUser'. 
  in E:\PHP\Doctrine-ORM\vendor\doctrine\dbal\src\Driver\PDO\SQLSrv\Driver.php:42
    Stack trace:
    #0 E:\PHP\Doctrine-ORM\vendor\doctrine\dbal\src\Driver\PDO\SQLSrv\Driver.php(42): PDO->__construct()
    #1 E:\PHP\Doctrine-ORM\vendor\doctrine\dbal\src\Connection.php(346): Doctrine\DBAL\Driver\PDO\SQLSrv\Driver->connect()
    #2 E:\PHP\Doctrine-ORM\vendor\doctrine\dbal\src\Connection.php(1619): Doctrine\DBAL\Connection->connect()
    #3 E:\PHP\Doctrine-ORM\vendor\doctrine\dbal\src\Connection.php(1013): Doctrine\DBAL\Connection->getWrappedConnection()
    #4 E:\PHP\Doctrine-ORM\tryIt.php(7): Doctrine\DBAL\Connection->prepare()
    #5 {main}

已确认用户名密码正确,当前环境为PHP 8.1.11,composer依赖配置:

{
    "require": {
        "doctrine/orm": "^2.11.0",
        "doctrine/dbal": "^3.2",
        "symfony/yaml": "^5.4",
        "symfony/cache": "^5.4"
    },
    "autoload": {
        "psr-0": {"": "src/"}
    }
}

可能原因及解决步骤

1. 确认SQL Server是否启用混合认证模式

SQL Server默认可能仅开启Windows认证模式,需切换为混合认证:

  • 打开SQL Server Management Studio,右键目标服务器 → 属性 → 安全性
  • 选择SQL Server和Windows身份验证模式,点击确定后重启SQL Server服务

2. 检查用户数据库访问权限

即使用户名密码正确,用户可能未被授予目标数据库的访问权限:

  • 在SSMS中,展开数据库 → testDatabase → 安全性 → 用户,确认myUser存在
  • 若不存在,进入服务器级别安全性 → 登录名,找到myUser右键 → 属性 → 用户映射
  • 勾选testDatabase,并分配必要角色(如db_datareader、db_datawriter)

3. 验证ODBC驱动兼容性

使用的ODBC Driver 17对SQL Server 2012的兼容性可能存在问题,建议降级到更适配的版本:

  • 下载安装ODBC Driver 13.1 for SQL Server(该版本对SQL Server 2012支持更稳定)
  • 确保PHP的pdo_sqlsrv扩展与该ODBC版本匹配,且在php.ini中启用(添加extension=pdo_sqlsrv)

4. 补充连接配置参数

针对SQL Server 2012,可在连接数组中添加适配参数:

$conn = array(
    'driver'   => "pdo_sqlsrv",
    'host'     => "sqlserver1", // 可尝试替换为服务器IP地址,避免DNS解析问题
    'user'     => "myUser",
    'password' => "fancyPwdHere123",
    'dbname'   => "testDatabase",
    'charset'  => 'UTF-8',
    'driverOptions' => array(
        PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8,
    ),
);

5. 排除Doctrine本身问题

先跳过Doctrine,用原生PDO测试连接,定位问题根源:

try {
    $pdo = new PDO("sqlsrv:Server=sqlserver1;Database=testDatabase", "myUser", "fancyPwdHere123");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "连接成功";
} catch(PDOException $e) {
    echo "连接失败: " . $e->getMessage();
}
  • 若原生PDO连接失败:问题出在数据库配置或PHP环境,需回到前几步排查
  • 若原生PDO连接成功:检查Doctrine的元数据路径是否正确,或清理Symfony缓存后重试

内容的提问来源于stack exchange,提问作者Zoltan Hernyak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:50:26