Codeigniter项目使用FIND_IN_SET实现多分类搜索的异常问题咨询
问题根因
你的代码逻辑结构本身没有问题,FIND_IN_SET 支持该场景下的使用,查询仅第一个分类生效的核心原因是数据库存储的 po_category 字段的逗号分隔项带有多余空格:FIND_IN_SET 采用精确匹配规则匹配列表中的每一项,你的示例存储格式为 46, 53, 76,逗号后带空格,拆分后的实际列表项为 46、 53、 76。搜索第一个分类46时完全匹配所以生效,搜索后续分类时你传入的值为无前置空格的53,和存储的 53不匹配,因此查询失败。
修复方案
方案1:修改查询逻辑适配现有存储格式
无需修改存量数据,直接在查询时对字段值做去空格处理,同时优化冗余逻辑、增加SQL注入防护,修改后代码如下:
if(!empty($category)) { $cat_array = explode(',', $category); // 先对搜索值去空格,避免传入值带空格的异常 $cat_array = array_map('trim', $cat_array); $this->db->group_start(); foreach($cat_array as $item) { // 对存储的分类字段去空格后再匹配,用查询绑定避免SQL注入 $this->db->or_where("FIND_IN_SET(?, REPLACE(po_category, ' ', ''))", $item); } $this->db->group_end(); }
补充:原代码中无需单独判断单分类/多分类场景,循环逻辑已经兼容单分类情况,可直接删掉冗余的单分类判断分支。
方案2:优化存储规范(长期推荐)
后续存储分类时统一去掉多余空格,存储为 46,53,76 这种无空格的标准逗号分隔格式,就不需要在查询时做 REPLACE 处理,查询效率更高。
内容的提问来源于stack exchange,提问作者Pecooou
相关产品推荐
相关产品推荐

