You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter多表JOIN查询问题:按日期范围获取发货费率数据

嘿,很高兴你自己找到了问题所在!让我再帮你梳理下这个问题的细节,确保后续不会再踩类似的坑:

问题背景

我有两张数据表:

  • 表1:dispatch_lists,字段包括 id、date_of_dispatch、customer_id
  • 表2:dispatch_lists_rates,字段包括 id、dispatch_list_id、item_id、weight、rate

我的需求是获取dispatch_lists_rates表中,对应dispatch_lists.date_of_dispatch在$start_date到$end_date范围内的记录(也就是特定月份内售出商品及其费率的列表)。

最初写的代码无法正常运行:

$this->db->select('dispatch_lists_rates.*, dispatch_lists.customer_id, dispatch_lists.date_of_dispatch')
->from('dispatch_lists_rates')
->where('dispatch_lists.date_of_dispatch >= '.$start_date)
->where('dispatch_lists.date_of_dispatch <= '.$end_date)
->join('dispatch_lists', 'dispatch_lists_rates.dispatch_list_id = dispatch_lists.id');
问题根源与修正方案

我刚发现了代码里的错误:原来的where子句把变量直接拼接进SQL字符串,这种写法不仅容易因为日期格式(比如字符串未加引号)导致语法错误,还存在SQL注入风险。

正确的写法应该是将变量作为参数传递给where方法,框架会自动处理字符串转义和引号:

$this->db->select('dispatch_lists_rates.*, dispatch_lists.customer_id, dispatch_lists.date_of_dispatch')
->from('dispatch_lists_rates')
->where('dispatch_lists.date_of_dispatch >= ', $start_date)
->where('dispatch_lists.date_of_dispatch <= ', $end_date)
->join('dispatch_lists', 'dispatch_lists_rates.dispatch_list_id = dispatch_lists.id');

另外,还可以用框架提供的where_between方法简化日期范围判断,代码会更简洁直观:

$this->db->select('dispatch_lists_rates.*, dispatch_lists.customer_id, dispatch_lists.date_of_dispatch')
->from('dispatch_lists_rates')
->join('dispatch_lists', 'dispatch_lists_rates.dispatch_list_id = dispatch_lists.id')
->where_between('dispatch_lists.date_of_dispatch', [$start_date, $end_date]);

内容的提问来源于stack exchange,提问作者jacobmathewin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:44:55