使用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
相关产品推荐
相关产品推荐

