CodeIgniter连接SQL Server需确保驱动可用、配置正确、结果可取:Windows需匹配PHP版本安装微软官方驱动,Linux/macOS需unixODBC+ODBC驱动;CI3必须用sqlsrv驱动并正确配置hostname(如.SQLEXPRESS);连接需执行查询验证而非仅加载;结果须用result_array()等方法提取。

CodeIgniter 连接 SQL Server 数据库,核心在于三件事:驱动可用、配置正确、结果可取。不是改个 dbdriver 就能通,中间几个关键环节容易卡住。
确认 PHP 环境已装好 SQL Server 驱动
CodeIgniter 本身不带 SQL Server 支持,必须靠 PHP 扩展。不同系统处理方式不同:
- Windows(推荐):下载微软官方《Microsoft Drivers for PHP for SQL Server》,选与你 PHP 版本(如 5.6/7.4/8.x)、线程安全(TS/NTS)和位数(x86/x64)完全匹配的版本。常见错误是 64 位系统用了 32 位 DLL,或 PHP 是 NTS 却加载了 TS 版驱动。
-
Linux/macOS:不能直接用 sqlsrv 扩展,需通过 unixODBC + Microsoft ODBC Driver for SQL Server 搭建底层连接,再让 CodeIgniter 的
mssql或自定义 ODBC 驱动调用它。CI3 官方 sqlsrv 驱动在 Linux 下不可用。 - 装完后检查 phpinfo() 页面是否出现 sqlsrv 和 pdo_sqlsrv 模块;若无,重启 Web 服务并确认 php.ini 中已启用:
extension=php_sqlsrv_80_ts.dll
extension=php_pdo_sqlsrv_80_ts.dll
配置 database.php 文件要匹配实例与认证方式
SQL Server 连接字符串比 MySQL 复杂,尤其涉及命名实例、端口、Windows 身份验证等。常见配置要点:
-
hostname:本地默认实例写
.或localhost;命名实例(如 SQLEXPRESS)必须写.\SQLEXPRESS(注意双反斜杠);远程服务器建议用 IP + 端口,如192.168.1.100,1433。 -
dbdriver:CI2 用
mssql(依赖旧 mssql_* 函数,PHP 7+ 已移除);CI3+ 必须用sqlsrv,否则会报“undefined function mssql_connect”。 - 用户名密码:SQL Server 混合模式下用 sa 或普通登录名;若用 Windows 身份验证,CI 不原生支持,需改用 PDO DSN 方式或代理服务。
- 示例 CI3 配置片段:
'dsn' => '',
'hostname' => '.\SQLEXPRESS',
'username' => 'sa',
'password' => 'your_pass',
'database' => 'MyAppDB',
'dbdriver' => 'sqlsrv',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => TRUE,
'cache_on' => FALSE,
'char_set' => 'utf8',
'dbcollat' => 'SQL_Latin1_General_CP1_CI_AS', // 注意:SQL Server 排序规则非 utf8_general_ci
'swap_pre' => '',
'autoinit' => TRUE,
'stricton' => FALSE
);
测试连接是否真成功,别只看 $this->db 是否加载
很多人以为 $this->load->database() 执行完就代表连上了,其实它只初始化类,不校验连接。真正验证要主动触发一次查询或初始化:
- 简单测试法(控制器中):
if ($config === FALSE || $config === null) {
echo '数据库连接未建立';
} else {
echo '连接资源有效';
}
- 更可靠的方式是执行一个轻量查询:
if ($query && $query->num_rows() > 0) {
echo '连接并可执行查询';
} else {
echo '连接失败或权限不足';
}
查到数据后,记得用对方法取值
CI 的 $this->db->query() 返回的是一个 CI_DB_sqlsrv_result 对象,不是数组。直接 print_r($query) 看不到数据,必须调用方法提取:
-
$query->result()→ 对象数组(每行是 stdClass) -
$query->result_array()→ 关联数组数组(最常用) -
$query->row()→ 第一行对象 -
$query->row_array()→ 第一行关联数组 -
$query->num_rows()→ 行数,判断是否有结果
例如获取用户列表:
$users = $this->db->query("SELECT id, name FROM users")->result_array();foreach ($users as $u) {
echo $u['name'];
}
不复杂但容易忽略。


















