codeigniter PHP代码点火器;防止表单重新提交

6yt4nkrj  于 2022-12-07  发布在  PHP
关注(0)|答案(4)|浏览(192)

我正在CodeIgniter项目中创建一个搜索页面。提交时,表单调用控制器函数,通过模型函数获取数据,并将结果数组传递给视图
问题是当我刷新结果页面时,表单正在重新提交,因为$_POST数据仍然在请求头中。
下面是我的表单的代码:

<!--form--> 
<form id="find" action="<?php echo base_url()?>search/find" method="post">
    <input type="text" name="search_key" class="tb4" id="search_key" placeholder="Search here"/>
    <input type="button" value="search"/>
</form>

下面是我的控制器的代码:

/*
     * function for fetching search results
     * @param void
     * @return void
     */
    public function find()
    {   
        $data['search_result']=$this->search_model->search($this->input->post('search_key'));
        $this->load->view('template/header');
        $this->load->view('pages/search_result',$data);
        $this->load->view('template/footer');
    }

我不能用redirect来代替加载视图,因为我必须将结果数组$data传递给视图。

gzszwxb4

gzszwxb41#

尝试重定向到自身

public function find()
{   
    $data['search_result']=$this->search_model->search($this->input->post('search_key'));
    if($this->input->post('search_key')) {
        redirect('yourcontroller/find');
    }
    $this->load->view('template/header');
    $this->load->view('pages/search_result',$data);
    $this->load->view('template/footer');
}
yduiuuwa

yduiuuwa2#

简单的解决方案是在表单中隐藏时间戳字段。

<?php echo form_hidden( 'TS', time() ); ?>

处理表单时,将此时间戳保存在会话中,

$this->session->set_userdata( 'form_TS', $this->input->post( 'TS' ) );

在处理表单之前,检查两个时间戳是否匹配

if ( $this->input->post( 'TS' ) != $this->session->userdata('form_TS') ) 
{...}
8hhllhi2

8hhllhi23#

如果你想避免重新提交,那么请在保存后重定向到相同的控制器上,就像这样。它可以使用会话来解决。如果有任何POST表单提交,

if (count($_POST) > 0){
  $this->session->set_userdata('post_data', $_POST );
  redirect('same_controller');
}
else{
  if($this->session->userdata('post_data')){
    $_POST = $this->session->userdata('post_data');
    $this->session->unset_userdata('post_data');
  }
}
sycxhyv7

sycxhyv74#

请使用以下内容:

$post_data = $this->session->userdata('post_data');
if ($post_data == $_POST){
    $this->session->unset_userdata('post_data');
    redirect(current_url(), 'refresh');
}else{
    $this->session->set_userdata('post_data', $_POST );
}

相关问题