【问题标题】:CodeIgniter - Repopulating an invalid form w/ redirectCodeIgniter - 使用重定向重新填充无效表单
【发布时间】:2011-12-27 21:41:58
【问题描述】:

我使用Post-Redirect-Get 模式来避免在 POST 提交后刷新页面时出现问题。重定向会清除所有发送的 POST 数据,这意味着我无法使用 set_value() 和相关函数再次填充这些字段。

为了更清楚,这里是它的工作原理。

  1. 客户端提交的 POST 包含无效数据。
  2. 发回一个 303 重定向标头。
  3. 客户端在标头位置执行 GET,但 POST 数据已消失,这意味着无法重新填充表单。

请帮忙? :)

【问题讨论】:

    标签: php forms http validation codeigniter


    【解决方案1】:

    将post数据设置为flashdata(会话类的一部分):

    $this->session->set_flashdata('post', $this->input->post());
    

    然后得到它:

    $this->session->flashdata('post');
    

    您也可以使数据保持更长时间:

    $this->session->keep_flashdata('post');
    

    更多:http://codeigniter.com/user_guide/libraries/sessions.html

    【讨论】:

      【解决方案2】:

      一种方法是在重定向之前将 POST 数据存储在会话中,例如如果您的表格是“注册”,那么您可以这样做:

      session_start();
      $_SESSION['register_form_data'] = array();
      
      foreach($_POST as $key=>$value)
      {
          $_SESSION['register_form_data'][$key] = $value;
      }
      

      现在表单数据将在表单页面上可用。您还可以创建一个 set_value_from_session() 辅助函数来重新填充字段。

      【讨论】:

      • 这不是 CodeIgniter 的标准用法。
      • 好的。我不知道闪存数据。我说的更笼统。
      • 不用担心 - 只是让你知道 = )
      【解决方案3】:

      您可以扩展 CI_Form_validation 并添加(或将其添加到 CI_Form_validation 构造)

      $CI =& get_instance(); $CI->load->library('session'); if (count($_POST) > 0 OR count($_FILES) > 0) { $CI->session->set_flashdata('prg', array( 'date' => time()+ini_get('max_execution_time'), 'post' => $_POST, 'files' => $_FILES )); redirect(current_url(), 'location', 302); } else{ $prg = $CI->session->flashdata('prg'); if($prg==TRUE){ if($prg['date']>time()){ $_POST = $prg['post']; $_FILES = $prg['files']; } } }

      到构造。 这将解决您的问题 但是,如果您在系统中提交表单后有任何 redirect() 函数,这些重定向将被上述重定向覆盖。所以请注意这一点。 (解决方法 - 您可以在没有 redirect() 的每个函数中调用它)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-10
        • 2016-03-15
        • 1970-01-01
        • 2011-03-13
        • 2012-05-05
        • 2014-02-09
        • 2011-04-11
        • 1970-01-01
        相关资源
        最近更新 更多