通过XAMPP连接SQL数据库报错:Driver's SQLSetConnectAttr failed
问题根因分析
- 报错信息中的后两条
01000状态码内容属于正常连接通知,仅为SQL Server告知客户端已成功切换到指定数据库、切换到默认英文语言,本身不属于错误。你输入错误账号密码时能返回正常的登录失败报错,也佐证了网络和基础连接逻辑完全正常。 - 连接返回失败的核心原因有两个:
sqlsrv扩展默认开启了「警告视为错误」的配置,上述正常通知被判定为错误,直接导致sqlsrv_connect返回false- 你当前使用的ODBC Driver 11版本较老,和PHP 8.0对应的新版sqlsrv扩展存在兼容性瑕疵,会触发
IM006的属性设置警告,进一步被错误规则拦截
解决方案
方案1:调整sqlsrv错误处理配置(优先验证)
在调用连接方法前,先修改sqlsrv的错误处理规则,仅将实际错误视为连接失败,忽略警告类信息:
function mssqlConnect(){ // 新增两行配置,关闭警告视为错误的规则 sqlsrv_configure("WarningsReturnAsErrors", 0); sqlsrv_configure("LogSeverity", SQLSRV_LOG_SEVERITY_ERROR); $ServerName = "xxx"; $ConnectionTimeout = 30; $connectionOptions = ["Database"=>"database","UID"=>"user","PWD"=>"password", "LoginTimeout" => $ConnectionTimeout]; $sqlconn = sqlsrv_connect($ServerName,$connectionOptions); if( $sqlconn ) { echo "Connection established"; } else { echo "Connection could not be established"; die( print_r( sqlsrv_errors(), true)); } }
修改后重新运行即可正常得到连接成功的提示。
方案2:升级ODBC驱动
适配PHP 8.0的sqlsrv扩展官方要求最低使用ODBC Driver 17 for SQL Server,你当前使用的11版本迭代时间过早,兼容性不足。可卸载当前ODBC驱动后安装17及以上版本,无需修改代码即可从底层解决兼容性问题。
方案3:显式指定驱动(临时兼容)
如果暂时无法升级ODBC驱动,可在连接参数中显式指定本地安装的ODBC驱动名称,避免驱动管理器自动匹配时出现属性设置异常:
$connectionOptions = [ "Database"=>"database", "UID"=>"user", "PWD"=>"password", "LoginTimeout" => $ConnectionTimeout, "Driver" => "ODBC Driver 11 for SQL Server" ];
内容的提问来源于stack exchange,提问作者Sicktightyo
相关产品推荐
相关产品推荐

