PHP Codeigniter ; Preventing form resubmit
我正在我的 CodeIgniter 项目中创建一个搜索页面。
提交时,表单调用控制器函数,通过模型函数获取数据并将结果数组传递给视图
问题是,当我刷新结果页面时,表单正在重新提交,因为 $_POST 数据仍然存在于请求标头中。
如何避免重新提交确认消息
以下是我的表单的代码:
1 2 3 4 5 | <!--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> |
以下是我的控制器的代码:
1 2 3 4 5 6 7 8 9 10 11 12 | /* * 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'); } |
请帮我解决这个问题。我不能使用重定向而不是加载视图,因为我必须将结果数组 $data 传递给视图。
尝试重定向到自身
1 2 3 4 5 6 7 8 9 10 | 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'); } |
简单的解决方案是在表单中隐藏一个时间戳字段。
1 |
处理表单时,将这个时间戳保存在会话中,
1 | $this->session->set_userdata( 'form_TS', $this->input->post( 'TS' ) ); |
在处理表单之前检查两个时间戳是否不匹配
1 2 | if ( $this->input->post( 'TS' ) != $this->session->userdata('form_TS') ) {...} |
如果您想避免重新提交,请在像这样在同一控制器上保存重定向后
可以使用会话来解决。如果有任何 POST 表单提交,
即
1 2 3 4 5 6 7 8 9 10 | 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'); } } |