CodeIgniter搜索函数问题:del_status筛选条件未生效排查
问题分析与修复方案
嘿,我一眼就瞅出两个关键问题导致你的del_status筛选不生效,咱们一个个拆解:
1. 逻辑运算符优先级打乱了查询逻辑
你当前代码生成的SQL语句会是这个样子:
SELECT * FROM `tablename` WHERE `username` LIKE '%{$data}%' OR `fullname` LIKE '%{$data}%' OR `email` LIKE '%{$data}%' AND `del_status` = '1'
SQL里AND的优先级比OR高,这条语句的实际执行逻辑变成了:
匹配username,或者匹配fullname,或者(匹配email且del_status=1)
这完全不符合你的需求——你要的是所有匹配搜索关键词的记录,同时满足del_status=0。
2. 需求与代码的del_status值不匹配
你明确说需求是查询del_status=0的数据,但代码里写的是$this->db->where('del_status','1');,直接把筛选值写反了!
修复后的代码
用CodeIgniter的group_start()和group_end()把所有or_like条件包裹起来,强制让这些OR条件作为一个整体,再和del_status的条件用AND关联,同时修正del_status的值:
public function SearchData($tablename,$data) { $this->db->select("*"); $this->db->from($tablename); // 把所有OR的like条件分组,确保它们是一个逻辑整体 $this->db->group_start(); $this->db->like('username', $data); $this->db->or_like('fullname', $data); $this->db->or_like('email', $data); $this->db->group_end(); // 修正为需求的del_status=0 $this->db->where('del_status', '0'); // 执行查询并返回结果 return $this->db->get()->result(); }
这样生成的SQL逻辑就完全正确了:
SELECT * FROM `tablename` WHERE (`username` LIKE '%{$data}%' OR `fullname` LIKE '%{$data}%' OR `email` LIKE '%{$data}%') AND `del_status` = '0'
现在这条查询会严格筛选出:要么username/fullname/email匹配搜索内容,同时del_status为0的有效数据。
内容的提问来源于stack exchange,提问作者Ahmed Gaber
相关产品推荐
相关产品推荐

