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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:36:03