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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:24:32