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
相关产品推荐
相关产品推荐

