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进行子查询