0

0

CodeIgniter 3 SQLSRV 数据库查询结果处理指南

聖光之護

聖光之護

发布时间:2025-11-26 13:43:02

|

366人浏览过

|

来源于php中文网

原创

CodeIgniter 3 SQLSRV 数据库查询结果处理指南

本文旨在解决 codeigniter 3 在使用 sqlsrv 驱动连接 sql server 数据库时,查询结果无法直接获取数据的问题。核心在于理解 codeigniter 的 query() 方法返回的是一个数据库结果对象,而非原始数据数组。教程将详细介绍如何通过调用 result_array() 等方法从结果对象中正确提取数据,并提供示例代码,确保开发者能够顺利获取并处理查询结果。

1. CodeIgniter 数据库查询结果对象解析

在使用 CodeIgniter 3 进行数据库操作时,无论是通过查询构造器(Query Builder)还是直接执行 SQL 语句,例如 $this-youjiankuohaophpcndb->query($sql),其返回的并不是直接的数据数组,而是一个数据库结果对象(Database Result Object)。这个对象封装了查询执行的状态以及获取结果的各种方法。

当您在模型中执行类似如下代码时:

$sql = "SELECT * FROM aplikasi";
$data = $this->db->query($sql);
var_dump($data); // 此时 $data 是一个对象,而不是期望的数据数组

var_dump($data) 的输出将是一个 CI_DB_sqlsrv_result 类型的对象,而不是您期望的行数据数组。这是 CodeIgniter 框架的正常行为,它提供了一系列方法来从这个结果对象中提取数据。直接对结果对象进行 var_dump 或尝试将其作为数组使用,将无法获得实际的数据库记录。

2. 正确获取查询结果的方法

要从数据库结果对象中获取实际的数据,您需要调用该对象提供的方法。CodeIgniter 提供了多种方法来满足不同的数据获取需求:

  • result_array(): 返回一个包含所有查询结果行的关联数组数组。每行数据都表示为一个关联数组。这是获取多行数据最常用的方法。
  • result(): 返回一个包含所有查询结果行的对象数组。每行数据都表示为一个标准对象。
  • row_array(): 返回单个结果行作为关联数组。通常用于查询只返回一行数据的情况(例如通过主键查询)。
  • row(): 返回单个结果行作为标准对象。同样适用于查询只返回一行数据的情况。
  • num_rows(): 返回查询结果的总行数。
  • num_fields(): 返回查询结果的字段(列)数量。

针对本例中需要获取多行数据的情况,最常用的方法是 result_array()。

3. 示例代码:修正模型层数据获取

以下是修正后的 CodeIgniter 模型代码,展示了如何正确地从 sqlsrv 查询结果中提取数据。

Cursor
Cursor

一个新的IDE,使用AI来帮助您重构、理解、调试和编写代码。

下载

原始模型代码(存在问题):

class Mod_login extends CI_Model{
    function Aplikasi(){
        $sql = "SELECT * FROM aplikasi";
        $data = $this->db->query($sql);
        var_dump($data); // 问题所在:直接 var_dump 结果对象
        die();
        if (!$data) { // 此处判断 $data 是否为 false 并不准确,因为 $data 始终是对象(除非查询失败)
            return false;
        } else {
            return $data;
        };
    }
}

修正后的模型代码:

class Mod_login extends CI_Model{
    function Aplikasi(){
        $sql = "SELECT * FROM aplikasi";
        $query_result = $this->db->query($sql); // 执行查询,返回结果对象或 FALSE

        // 重要的错误处理:检查查询是否成功执行
        if ($query_result === FALSE) {
            // 查询执行失败,例如SQL语法错误、表不存在等
            log_message('error', 'Database query failed: ' . $this->db->error()['message']);
            return []; // 返回空数组或根据业务逻辑返回 false
        }

        // 查询成功,从结果对象中获取数据
        $data = $query_result->result_array(); // 获取所有结果行作为关联数组数组

        // 调试时可以取消注释以下两行,查看实际获取的数据
        // var_dump($data);
        // die();

        // 返回处理后的数据
        return $data;
    }
}

在控制器中调用此模型方法时,您将直接获得一个包含数据的数组,可以直接用于视图层:

public function index()
{
    $logged_in = $this->session->userdata('logged_in');
    if ($logged_in == TRUE) {
        redirect('dashboard');
    } else {
        // $aplikasi['aplikasi'] 现在将是一个包含数据库记录的数组
        $aplikasi['aplikasi'] = $this->Mod_login->Aplikasi();
        $this->load->view('admin/login_data', $aplikasi);
    }
}

4. 注意事项与最佳实践

  1. 错误处理的准确性: $this->db->query() 在查询语句执行失败时(例如 SQL 语法错误、表不存在)会返回 FALSE。因此,正确的错误处理应该是检查 $query_result === FALSE。如果查询成功但没有匹配的行,result_array() 会返回一个空数组 [],这通常是期望的行为,而不是错误。
  2. 调试技巧: 在开发阶段,使用 var_dump($this->db->last_query()); 可以查看 CodeIgniter 执行的最后一条 SQL 语句,这对于调试 SQL 语法错误或验证查询逻辑非常有帮助。
  3. 数据库配置检查: 确保您的 application/config/database.php 配置中 sqlsrv 驱动的相关参数(hostname, username, password, database, char_set 等)与 SQL Server 数据库的实际信息完全匹配。特别是 hostname,可能需要指定端口号或实例名(例如 hostname' => '10.***.***.*,1433' 或 hostname' => '10.***.***.*\SQLEXPRESS')。
  4. PHP SQLSRV 扩展: 确保您的 PHP 环境已正确安装并启用了适用于您 PHP 版本的 php_sqlsrv 和 php_pdo_sqlsrv 扩展。这是连接 SQL Server 的前提条件。
  5. 安全性: 尽管本例使用了硬编码的 SQL 语句,但在实际开发中,强烈建议使用 CodeIgniter 的查询构造器(Query Builder)来构建查询。查询构造器会自动处理参数绑定,从而有效防止 SQL 注入攻击,提高应用安全性:
    $this->db->select('*');
    $this->db->from('aplikasi');
    // 如果有 WHERE 条件,可以使用 $this->db->where('column', $value);
    $query_result = $this->db->get(); // get() 方法返回结果对象
    $data = $query_result->result_array();
  6. save_queries 配置: 在 database.php 中,'save_queries' => FALSE 可能会影响调试时获取 last_query() 的能力(last_query() 可能返回空)。如果需要频繁调试 SQL 语句,可以将其设置为 TRUE。

总结

在 CodeIgniter 3 中使用 sqlsrv 驱动进行数据库查询时,关键在于理解 $this->db->query() 返回的是一个数据库结果对象。要获取实际的数据,必须调用该结果对象上的方法,如 result_array() 或 result()。通过正确地处理这个结果对象,并结合适当的错误处理和安全实践,开发者可以有效地获取并利用 SQL Server 返回的数据,从而构建稳定可靠的应用程序。遵循上述指南和最佳实践,将有助于避免常见的数据库数据获取问题,并提升代码的健壮性和可维护性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1134

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2194

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1703

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

586

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

440

2024.04.29

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号