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注入问题,安全又省心。而且只有当字段有值的时候才会加入查询条件,避免无意义的空条件。
第三步:进阶优化技巧
- 分页支持:如果搜索结果很多,结合CodeIgniter的分页类
$this->pagination来实现分页,提升页面加载速度和用户体验。 - 字段验证:可以用CodeIgniter的表单验证类
$this->form_validation来验证用户输入的合法性,比如数字字段只能输入数字。 - 默认条件:可以给一些字段设置默认的搜索条件,比如默认按时间排序。
- 保存搜索历史:如果需要,可以把用户的搜索参数存在session里,方便用户再次使用。
内容的提问来源于stack exchange,提问作者TheOrdinaryGeek
相关产品推荐
相关产品推荐

