CodeIgniter 3 查询未返回 null 或 0 的原因及正确写法

浅静姑娘_8182

浅静姑娘_8182

2026-01-13

171人浏览

原创

CodeIgniter 3 查询未返回 null 或 0 的原因及正确写法

当 codeigniter 3 查询无匹配记录时,`row()->sold_price` 会触发 php 致命错误(因访问 null 对象属性),而非返回 0 或 null;根本原因是链式调用缺乏空值保护,且 `where()` 多参数误用导致 sql 条件拼接错误。

在 CodeIgniter 3 中,$this->db->where() 方法不支持单次调用传入多个条件字段(如你原代码中 ->where('category_ID', $caid,'sold_date >=',$prev_year_start_month,...))。这种写法会导致 CI 忽略后续参数,仅执行第一个 where('category_ID', $caid),其余日期条件被丢弃——这正是查询“跨年拉取数据”的根源:缺少日期过滤,数据库返回了其他年份的任意匹配记录。

✅ 正确做法是将每个 WHERE 条件拆分为独立的 where() 调用,或使用字符串形式的复合条件:

// ✅ 推荐:清晰、安全、符合 CI 最佳实践
$query = $this->db->select_sum('sold_price')
                  ->from('tbl_sales')
                  ->where('category_ID', $caid)
                  ->where('sold_date >=', $prev_year_start_month)
                  ->where('sold_date group_by('category_ID')
                  ->get();

$result = $query->row();
$sold_price = ($result && isset($result->sold_price)) ? (float)$result->sold_price : 0.0;

⚠️ 注意事项:

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
  • 永远不要直接调用 ->row()->xxx:若查询无结果,row() 返回 null,再访问 ->sold_price 将抛出 Trying to get property 'sold_price' of non-object 错误;
  • 使用 isset() 或三元判断确保对象存在;
  • 日期字段(如 sold_date)需确保数据库中为 DATE 或 DATETIME 类型,且 $prev_year_start_month、$prev_year_end_month 格式为 'Y-m-d'(如 '2023-01-01'),避免隐式类型转换;
  • 若需兼容无分组场景(如单条记录),可改用 ->row_array() + array_key_exists() 增强健壮性;
  • 避免拼接 SQL 字符串(如第二种答案中的 "category_ID= $caid AND..."),易引发 SQL 注入,除非 $caid 和日期变量已严格过滤(强烈不推荐)。

? 进阶建议:封装为可复用方法,自动处理空值与类型转换:

protected function getSumByDateRange($table, $sum_field, $where_conditions = [], $date_field = 'sold_date', $start = '', $end = '') {
    $this->db->select_sum($sum_field);
    $this->db->from($table);

    foreach ($where_conditions as $key => $value) {
        $this->db->where($key, $value);
    }

    if (!empty($start) && !empty($end)) {
        $this->db->where("{$date_field} >= ", $start);
        $this->db->where("{$date_field} db->get()->row();
    return $row ? (float)($row->$sum_field ?? 0) : 0.0;
}

// 调用示例
$total = $this->getSumByDateRange(
    'tbl_sales', 
    'sold_price', 
    ['category_ID' => $caid], 
    'sold_date', 
    $prev_year_start_month, 
    $prev_year_end_month
);

通过规范 where() 用法 + 主动判空,即可彻底解决“本该返回 0 却报错或返回错误数据”的问题,保障查询逻辑的准确性和系统稳定性。

相关专题

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

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

2023.10.12

4583

8

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

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

2023.10.27

951

4

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

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

2024.02.23

1209

5

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

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

2024.03.06

6561

10

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

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

2024.03.06

3323

4

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

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

2024.04.07

6520

11

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

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

2024.04.29

8961

6

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

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

2024.04.29

1210

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1072

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习