【问题标题】:PHP Codeigniter ; Preventing form resubmitPHP 代码点火器;防止表单重新提交
【发布时间】:2013-12-20 07:41:58
【问题描述】:

我正在我的 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');
    }

请帮我解决这个问题。我不能使用重定向来代替加载视图,因为我必须将结果数组 $data 传递给视图。

【问题讨论】:

  • 检查请求是否是post,并且请求中有post数据。然后加载结果。否则做一些事情
  • 没关系....问题在于刷新结果页面时,浏览器会显示确认消息以重新提交表单

标签: php forms codeigniter redirect


【解决方案1】:

尝试重定向到自身

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');
}

【讨论】:

  • 没错,重定向将服务于工作,因为下次它不会获得提交表单,做得好。
【解决方案2】:

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

<?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') ) 
{...} 

【讨论】:

    【解决方案3】:

    如果您想避免重新提交,请在像这样在同一控制器上保存重定向后 可以使用会话来解决。如果有任何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');
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-24
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 2014-07-29
      • 1970-01-01
      • 2017-07-21
      相关资源
      最近更新 更多