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

CodeIgniter4 4.2.1版本无法连接SQLServer数据库问题

问题根因

这是CodeIgniter 4 4.2.0版本起对sqlsrv数据库驱动连接逻辑做的不兼容改动导致的,和SQL Server服务端配置、PHP sqlsrv扩展状态无关:

  • 4.1.9及更早版本的连接逻辑:如果hostname字段填写了IP\实例名格式的地址,框架会自动忽略手动配置的port参数,通过SQL Server Browser服务查询对应实例的实际监听端口后再发起连接,因此原有配置可以正常连通。
  • 4.2.1版本调整了判断规则:只要配置数组中port字段存在非空值,无论hostname是否携带实例名后缀,都会强制将该端口追加到连接地址末尾,直接跳过实例端口解析流程。你原有配置中填写的1200端口并不是SQLEXPRESS实例的实际监听端口,请求发送到错误端口自然会被目标计算机拒绝,触发你看到的TCP连接报错。
解决方案

按需选择以下任意一种配置调整方式即可,不需要回退框架版本,也不需要修改SQL Server端配置:

  • 方案1(保留实例名连接方式):删除数据库配置中的port项,或者将port的值设为null/空字符串,框架就会恢复原有逻辑,自动解析实例对应端口发起连接。
    调整后的配置参考:
    public $local = [
        'DSN' => '',
        'hostname' => '11.11.22.3\SQLEXPRESS',
        'username' => 'ROOT',
        'password' => 'EJEMPLO',
        'database' => 'EJEMPLO',
        'DBDriver' => 'sqlsrv',
        'DBPrefix' => '',
        'pConnect' => false,
        'DBDebug' => (ENVIRONMENT !== 'production'),
        'charset' => 'utf8',
        'DBCollat' => 'utf8_general_ci',
        'swapPre' => '',
        'encrypt' => false,
        'compress' => false,
        'strictOn' => false,
        'failover' => [],
        // 移除port配置,或设置为 'port' => null
    ];
    
  • 方案2(固定端口直连方式):如果你明确知道目标SQL Server实例实际监听的固定TCP端口,可以把hostname中的实例名后缀删除,仅保留服务器IP,同时将port项的值改为实例真实监听的端口号,直接通过IP+端口直连,不需要走SQL Server Browser服务解析。
注意事项

配置修改完成后,清空writable/cache目录下的所有缓存文件再测试连接,避免框架读取旧的配置缓存导致问题复现。


内容的提问来源于stack exchange,提问作者Diego Armando Suarez Echanique

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:09:15