PHP连接SQL Server遇SQLSTATE[28000]登录失败问题求助
解决SQL Server登录失败的排查方案
问题分析
报错 SQLSTATE[28000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Login failed for user $username 指向SQL账号登录被拒,ODBC版本不是核心问题,重点排查账号有效性、连接参数、权限配置。
排查步骤
- 验证账号密码有效性
用SQL Server Management Studio(SSMS)手动测试:选择「SQL Server身份验证」,输入代码里的$username和$password登录。如果SSMS登录失败,说明账号密码错误、账号被锁定或禁用,先在数据库端修复账号状态。 - 检查账号的数据库访问权限
即使账号能登录SSMS,也要确认它有权访问目标数据库$dbname:在SSMS中找到该账号→右键「属性」→「用户映射」,勾选目标数据库,至少分配基础读写权限(如db_datareader/db_datawriter)。 - 修正连接字符串参数
连接字符串的Server参数格式常出问题:- 本地数据库:尝试
localhost、127.0.0.1或.\SQLEXPRESS(Express版默认实例名) - 远程数据库:需指定端口,格式为
Server=xxx.xxx.xxx.xxx,1433(1433为默认端口,修改过则对应调整) - ODBC 17+默认要求加密,可添加
Encrypt=yes参数:$conn = new PDO("sqlsrv:Server=$servername;Database=$dbname;Encrypt=yes", $username, $password);
- 本地数据库:尝试
- 确认SQL Server服务运行状态
打开services.msc,检查对应SQL Server实例的服务(如SQL Server (MSSQLSERVER))是否处于运行状态,未启动则手动启动。 - 排查防火墙限制
远程连接时,确保数据库服务器防火墙开放了SQL Server端口(默认1433),同时本地防火墙允许PHP进程访问该端口。 - 检查PHP sqlsrv扩展
执行以下代码确认PHP是否加载了sqlsrv驱动:
输出需包含print_r(PDO::getAvailableDrivers());sqlsrv,否则需下载对应PHP版本的sqlsrv扩展,配置到php.ini中。
额外提示
若使用SQL Server Express版本,实例名默认为SQLEXPRESS,连接字符串的Server参数需写成.\SQLEXPRESS或localhost\SQLEXPRESS。
内容的提问来源于stack exchange,提问作者SamATEIT
相关产品推荐
相关产品推荐

