CodeIgniter立法搜索应用结果页构建:数据提交与重定向实现
嘿,作为CodeIgniter新手碰到这个问题太正常了!我来一步步帮你搞定结果页的构建,完美适配你的需求——POST提交后重定向、处理可选搜索条件都不在话下~
第一步:处理表单提交与重定向(PRG模式)
首先要遵循**Post/Redirect/Get(PRG)**模式,这能避免用户刷新结果页时重复提交表单,是HTTP开发的最佳实践。我们需要一个专门的方法接收POST数据,处理后重定向到结果页。
先创建一个Search控制器(或者在已有的首页控制器里加方法,不过单独的搜索控制器更清晰):
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Search extends CI_Controller { public function __construct() { parent::__construct(); $this->load->model('Legislation_model'); // 加载你的立法数据模型 $this->load->library('session'); // 加载Session库,用来暂存搜索参数 } // 接收表单POST提交 public function submit() { // 收集所有搜索参数,包括可选条件 $search_params = [ 'legislation_type' => $this->input->post('legislation_type'), // 假设这是必填项 'year' => $this->input->post('year'), // 可选 'keyword' => $this->input->post('keyword') // 可选 ]; // 把参数存入Session,因为重定向后POST数据会丢失 $this->session->set_userdata('search_params', $search_params); // 重定向到结果页方法 redirect('search/results'); } }
第二步:构建结果页的控制器逻辑
接下来写结果页的方法,从Session中取出搜索参数,调用模型查询数据库,处理可选条件:
// 结果页渲染方法 public function results() { // 从Session获取搜索参数,防止用户直接访问结果页 $search_params = $this->session->userdata('search_params'); if (!$search_params) { redirect('home'); // 没有参数就跳回首页 } // 调用模型查询数据(模型里封装查询逻辑更规范) $data['legislations'] = $this->Legislation_model->get_matching_legislations($search_params); $data['search_params'] = $search_params; // 把参数传给视图,显示当前搜索条件 // 加载视图模板和结果页 $this->load->view('templates/header'); $this->load->view('search/results', $data); $this->load->view('templates/footer'); // 可选:如果不想保留Session参数,可以在这里清除,避免用户再次进入结果页用旧参数 // $this->session->unset_userdata('search_params'); }
然后是Legislation_model模型,用CodeIgniter的Query Builder处理可选条件(自动处理空参数,不会生成无效的SQL):
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Legislation_model extends CI_Model { public function get_matching_legislations($params) { $this->db->select('*'); $this->db->from('legislations'); // 你的立法数据表名 // 必填条件:立法类型(如果是必填的话) if (!empty($params['legislation_type'])) { $this->db->where('type', $params['legislation_type']); } // 可选条件:年份 if (!empty($params['year'])) { $this->db->where('year', $params['year']); } // 可选条件:关键词模糊搜索(标题或内容) if (!empty($params['keyword'])) { $this->db->group_start(); // 确保OR条件只在关键词范围内,避免逻辑错误 $this->db->like('title', $params['keyword']); $this->db->or_like('content', $params['keyword']); $this->db->group_end(); } // 执行查询并返回结果 return $this->db->get()->result(); } }
第三步:编写结果页视图
最后是结果页的视图文件(application/views/search/results.php),展示搜索条件和结果,还要处理空结果的情况:
<h2>立法搜索结果</h2> <!-- 显示当前搜索条件,让用户清楚自己搜了什么 --> <div class="search-filters"> <p>当前搜索条件: <?php if (!empty($search_params['legislation_type'])): ?> <span>立法类型:<?php echo htmlspecialchars($search_params['legislation_type']); ?></span> <?php endif; ?> <?php if (!empty($search_params['year'])): ?> <span>年份:<?php echo htmlspecialchars($search_params['year']); ?></span> <?php endif; ?> <?php if (!empty($search_params['keyword'])): ?> <span>关键词:<?php echo htmlspecialchars($search_params['keyword']); ?></span> <?php endif; ?> </p> </div> <!-- 搜索结果列表 --> <?php if (count($legislations) > 0): ?> <ul class="legislation-list"> <?php foreach ($legislations as $item): ?> <li> <h3><?php echo htmlspecialchars($item->title); ?></h3> <p class="year">发布年份:<?php echo $item->year; ?></p> <p class="excerpt"><?php echo substr(htmlspecialchars($item->content), 0, 200); ?>...</p> <a href="<?php echo site_url('legislation/detail/'.$item->id); ?>">查看完整内容</a> </li> <?php endforeach; ?> </ul> <?php else: ?> <div class="no-results"> <p>没有找到符合条件的立法文件,请调整搜索条件后重试~</p> <a href="<?php echo site_url('home'); ?>">返回搜索页</a> </div> <?php endif; ?>
关键注意点
- 安全性:用
htmlspecialchars()转义输出内容,防止XSS攻击;CodeIgniter的Query Builder会自动处理SQL注入,不用手动转义参数。 - 参数传递的替代方案:如果不想用Session,也可以把参数转成GET参数拼在重定向URL里(比如
redirect('search/results?type='.urlencode($type).'&year='.$year)),但Session的方式更干净,尤其是参数较多时。 - 必填/可选条件区分:根据你的需求调整
empty()判断,比如如果立法类型是必填项,可以在表单里加required属性,或者在控制器里做校验。
内容的提问来源于stack exchange,提问作者Renan Sanches
相关产品推荐
相关产品推荐

