CodeIgniter 3 查询在无匹配记录时返回非空值的问题解析与修复
发布时间 - 2026-01-13 00:00:00 点击率:次codeigniter 3 的 `select_sum()` 查询在指定日期范围内无数据时,可能错误返回 `null` 或引发报错,而非预期的 `0`;根本原因在于链式 `where()` 参数误用导致 sql 条件拼接异常,需规范条件写法并主动处理空结果。
在 CodeIgniter 3 中,$this->db->where() 方法不支持四参数或五参数混用形式(如 where('field', $val, 'cond1', $val1, 'cond2', $val2)),你原始代码中的写法:
->where('category_ID', $caid,'sold_date >=',$prev_year_start_month,'sold_date <=',$prev_year_end_month)是非法且被忽略的语法。CI 3 仅识别前两个参数(字段名 + 值)或两个参数的字符串形式(如 where("a = b AND c > d"))。上述写法会导致后置
条件完全失效,最终生成的 SQL 实际等价于:
WHERE category_ID = ? -- 其他日期条件丢失!
因此查询范围失控,跨年数据被意外包含——这正是你在 SQLyog 中手动执行能得正确结果、而 CI 查询却“拉取其他年份数据”的根本原因。
✅ 正确做法是分多次调用 where(),确保每个条件独立、清晰、安全:
$query = $this->db->select_sum('sold_price')
->from('tbl_sales')
->where('category_ID', $caid)
->where('sold_date >=', $prev_year_start_month)
->where('sold_date <=', $prev_year_end_month)
->group_by('category_ID')
->get();
$result = $query->row();
// 关键:显式处理 NULL 情况,确保返回 0 而非 NULL 或报错
$sold_price = ($result && isset($result->sold_price)) ? (int)$result->sold_price : 0;⚠️ 注意事项:
- 永远不要依赖 ->row()->field 直接访问:若查询无结果,row() 返回 NULL,再调用 ->sold_price 将触发 PHP “Trying to get property of non-object” 错误;
- 使用预处理语句(CI 默认开启)可防止 SQL 注入,因此推荐分写 where(),而非拼接字符串;
- 若需更灵活的日期范围,可改用 BETWEEN:
->where("sold_date BETWEEN '{$prev_year_start_month}' AND '{$prev_year_end_month}'")(注意:仅当变量已严格过滤/转义时才建议此写法,否则优先选参数化方式)
? 总结:CI3 查询“不返回 0”本质是逻辑缺陷——不是框架不返回 0,而是条件未生效导致查了不该查的数据;修复核心是语法合规 + 结果判空 + 类型兜底。养成 row() 后判空的习惯,是构建健壮 CI 应用的必备实践。
# php
# go
# ai
# sql
# Object
# NULL
# 字符串
# Property
# this
# 而非
# 链式
# 报错
# 根本原因
# 你在
# 不支持
# 时才
# 法会
# 更灵活
# 字段名
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel API资源类怎么用_Laravel API Resource数据转换
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
Android自定义控件实现温度旋转按钮效果
Laravel如何为API编写文档_Laravel API文档生成与维护方法
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
JavaScript中的标签模板是什么_它如何扩展字符串功能
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
如何生成腾讯云建站专用兑换码?
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
高端建站如何打造兼具美学与转化的品牌官网?
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
Laravel用户密码怎么加密_Laravel Hash门面使用教程
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
如何破解联通资金短缺导致的基站建设难题?
JavaScript如何实现音频处理_Web Audio API如何工作?
七夕网站制作视频,七夕大促活动怎么报名?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
实例解析angularjs的filter过滤器
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
SQL查询语句优化的实用方法总结
原生JS实现图片轮播切换效果
免费视频制作网站,更新又快又好的免费电影网站?
香港服务器选型指南:免备案配置与高效建站方案解析
Laravel如何实现一对一模型关联?(Eloquent示例)
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
深圳网站制作平台,深圳市做网站好的公司有哪些?
微信小程序 canvas开发实例及注意事项
Laravel怎么使用Intervention Image库处理图片上传和缩放
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
Linux安全能力提升路径_长期防护思维说明【指导】
Laravel如何处理文件下载请求?(Response示例)
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
高端网站建设与定制开发一站式解决方案 中企动力
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Laravel如何生成URL和重定向?(路由助手函数)
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
如何快速查询网站的真实建站时间?
如何做网站制作流程,*游戏网站怎么搭建?
简单实现Android验证码
网站优化排名时,需要考虑哪些问题呢?
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
Laravel如何使用Eloquent进行子查询

