codeigniter连接sql server失败主因是驱动未加载或不匹配:需下载对应php版本及ts/nts模式的microsoft drivers,启用php_sqlsrv和php_pdo_sqlsrv扩展,配置dbdriver='sqlsrv',禁用pconnect,并确保hostname端口正确。

$this->conn_id 为空,说明连接根本没建立成功——不是配置写错了,就是 PHP 驱动压根没加载或不匹配。
确认 SQL Server 驱动已正确安装并启用
CodeIgniter 的 sqlsrv 驱动依赖 PHP 原生的 sqlsrv 和 pdo_sqlsrv 扩展,不是装个 php_mssql.dll 就能用(那个是旧版、已废弃、不支持 SQL Server 2012+)。你必须:
- 去微软官网下载对应 PHP 版本和线程安全模式(TS/NTS)的 Microsoft Drivers for PHP for SQL Server
- PHP 5.6 TS → 要用
php_sqlsrv_56_ts.dll+php_pdo_sqlsrv_56_ts.dll;但注意:64 位 Windows 上官方只提供 NTS 版,若你用的是 Apache TS 模式 + 64 位系统,大概率会报undefined function sqlsrv_connect() - 修改
php.ini,确保两行扩展都在有效位置(无分号注释),且路径正确:extension=php_sqlsrv_56_ts.dll<br>extension=php_pdo_sqlsrv_56_ts.dll
- 重启 Web 服务后,运行
phpinfo(),搜索sqlsrv,看到模块信息才表示加载成功
数据库配置中 hostname 和 dbdriver 必须严格匹配驱动版本
CI 2.x 和 CI 3.x 对 SQL Server 的支持方式不同,不能混用配置:
- CI 2.2.x 只支持
dbdriver = 'mssql',它底层调用的是已弃用的mssql_*函数,仅兼容 SQL Server 2008 及更早版本,且要求启用php_mssql.dll(Windows + PHP ≤5.6) - CI 3.x 起强制使用
dbdriver = 'sqlsrv',依赖sqlsrv_*扩展,支持 SQL Server 2008R2 及以上,包括 Azure SQL -
hostname写法有讲究:
– 本地命名实例(如.\SQLEXPRESS)需确保 SQL Server Browser 服务已启动;
– 远程 IP + 端口要显式写成192.168.1.100,1433(注意是英文逗号,不是冒号);
– 使用 TCP/IP 连接时,避免用主机名而不用 IP,DNS 解析失败会导致$this->conn_id为空
连接失败时最常被忽略的三个配置项
即使驱动和 hostname 都对,以下三项配错也会让 sqlsrv_connect() 返回 false,进而导致 $this->conn_id 为 null:
-
'pconnect' => FALSE:SQLSRV 不支持持久连接,设为TRUE会静默失败(CI 2.2 默认是TRUE,必须手动改成FALSE) -
'encrypt' => FALSE:某些 SQL Server 实例强制加密,此时需设为TRUE并配合'trust_server_certificate' => TRUE -
'port' => ''或未指定端口:如果 SQL Server 不在默认 1433 端口运行(比如命名实例动态分配端口),必须在hostname后加端口号,或单独配'port' => 57482
查询执行后拿不到数据?不是连不上,是没解包
连接成功 ≠ 查询结果能直接 echo。CI 的 $this->db->query() 返回的是一个 CI_DB_sqlsrv_result 对象,不是数组:
- 错误写法:
echo $query->name;(对象属性不存在) - 正确取值方式:
–$query->result_array()→ 关联数组二维结构
–$query->row_array()→ 第一行的关联数组
–$query->num_rows()→ 判断是否有结果,比empty($query)可靠 - 特别注意:CI 2.2 中
result()返回的是对象数组,字段名是小写;SQL Server 默认大小写敏感,若表字段是UserName,对象里实际是$row->username(驱动自动转小写)
真正卡住人的地方,往往不是“怎么配”,而是“配了但没生效”——驱动没加载、TS/NTS 搞反、pconnect 设成 true、hostname 解析失败,这些都不会抛明显异常,只会让 $this->conn_id 保持 null,然后在 sqlsrv_query() 里崩掉。











