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

CodeIgniter 3 基于查询字符串的高级搜索过滤器实现

扩展CodeIgniter 3基础搜索为高级搜索

嘿,我来帮你把这个基础搜索升级成实用的高级搜索功能,结合CodeIgniter 3的特性一步步来,操作简单还灵活~

第一步:更新HTML表单

首先得把原来的单个输入框改成对应各搜索列的字段,还可以给每个字段加条件选择(比如“等于”“包含”“大于”),让用户更灵活地筛选。举个示例表单:

<form method="get" action="<?php echo site_url('search/advanced'); ?>">
  <div class="search-group">
    <label for="column1">Column 1:</label>
    <input type="text" name="column1" id="column1" value="<?php echo $this->input->get('column1'); ?>">
    <!-- 可选:添加条件下拉框 -->
    <select name="column1_op" id="column1_op">
      <option value="eq" <?php echo ($this->input->get('column1_op') == 'eq') ? 'selected' : ''; ?>>等于</option>
      <option value="like" <?php echo ($this->input->get('column1_op') == 'like') ? 'selected' : ''; ?>>包含</option>
    </select>
  </div>
  <div class="search-group">
    <label for="column2">Column 2:</label>
    <input type="text" name="column2" id="column2" value="<?php echo $this->input->get('column2'); ?>">
    <select name="column2_op" id="column2_op">
      <option value="eq" <?php echo ($this->input->get('column2_op') == 'eq') ? 'selected' : ''; ?>>等于</option>
      <option value="gt" <?php echo ($this->input->get('column2_op') == 'gt') ? 'selected' : ''; ?>>大于</option>
    </select>
  </div>
  <div class="search-group">
    <label for="column3">Column 3:</label>
    <input type="text" name="column3" id="column3" value="<?php echo $this->input->get('column3'); ?>">
  </div>
  <!-- 可选:添加逻辑组合选项 -->
  <div class="search-group">
    <label>条件组合:</label>
    <select name="logic">
      <option value="AND" <?php echo ($this->input->get('logic') == 'AND') ? 'selected' : ''; ?>>所有条件都满足</option>
      <option value="OR" <?php echo ($this->input->get('logic') == 'OR') ? 'selected' : ''; ?>>满足任一条件</option>
    </select>
  </div>
  <button type="submit">高级搜索</button>
</form>

这里特意做了表单回显,用户提交后能看到自己填的内容,体验会好很多。

第二步:后端Controller逻辑处理

接下来在你的搜索Controller里,要逐个判断每个字段是否有值,然后根据用户选择的条件来构建查询(代替原来硬写的多个where等于)。示例代码如下:

public function advanced() {
    // 获取所有搜索参数,用默认值兜底避免报错
    $column1 = trim($this->input->get('column1') ?? '');
    $column1_op = $this->input->get('column1_op') ?: 'eq';
    $column2 = trim($this->input->get('column2') ?? '');
    $column2_op = $this->input->get('column2_op') ?: 'eq';
    $column3 = trim($this->input->get('column3') ?? '');
    $logic = $this->input->get('logic') ?: 'AND';

    // 初始化查询构造器
    $this->db->from('records');

    // 开始条件分组,支持AND/OR逻辑组合
    $this->db->group_start();
    $has_conditions = false;

    // 处理Column1的搜索条件
    if (!empty($column1)) {
        $has_conditions = true;
        switch ($column1_op) {
            case 'like':
                $this->db->like('column1', $column1);
                break;
            case 'eq':
            default:
                $this->db->where('column1', $column1);
                break;
        }
    }

    // 处理Column2的搜索条件,结合逻辑组合
    if (!empty($column2)) {
        if ($has_conditions && $logic == 'OR') {
            $this->db->or_group_start();
        } elseif ($has_conditions) {
            $this->db->group_start();
        }
        $has_conditions = true;
        
        switch ($column2_op) {
            case 'gt':
                $this->db->where('column2 >', $column2);
                break;
            case 'eq':
            default:
                $this->db->where('column2', $column2);
                break;
        }
        
        if ($has_conditions && ($logic == 'OR' || $logic == 'AND')) {
            $this->db->group_end();
        }
    }

    // 处理Column3的搜索条件(示例用模糊匹配)
    if (!empty($column3)) {
        if ($has_conditions && $logic == 'OR') {
            $this->db->or_like('column3', $column3);
        } else {
            $this->db->like('column3', $column3);
        }
    }
    $this->db->group_end();

    // 执行查询并获取结果
    $query = $this->db->get();
    $data['results'] = $query->result();
    // 把搜索参数回传给视图,方便表单回显
    $data['search_params'] = $this->input->get();

    // 加载搜索结果视图
    $this->load->view('search_results', $data);
}

这里用了CodeIgniter的查询构造器,自动帮你处理SQL注入问题,安全又省心。而且只有当字段有值的时候才会加入查询条件,避免无意义的空条件。

第三步:进阶优化技巧

  1. 分页支持:如果搜索结果很多,结合CodeIgniter的分页类$this->pagination来实现分页,提升页面加载速度和用户体验。
  2. 字段验证:可以用CodeIgniter的表单验证类$this->form_validation来验证用户输入的合法性,比如数字字段只能输入数字。
  3. 默认条件:可以给一些字段设置默认的搜索条件,比如默认按时间排序。
  4. 保存搜索历史:如果需要,可以把用户的搜索参数存在session里,方便用户再次使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:51:17