CodeIgniter - 使用重定向重新填充无效表单

时间:2011-11-13 03:19:10

标签: php forms http validation codeigniter

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

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

  1. 客户端提交包含无效数据的POST。
  2. 发送303重定向标头。
  3. 客户端在标头位置执行GET但POST数据消失,这意味着无法重新填充表单。
  4. 帮助pleeeease? :)

3 个答案:

答案 0 :(得分:6)

将发布数据设置为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

答案 1 :(得分:0)

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

session_start();
$_SESSION['register_form_data'] = array();

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

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

答案 2 :(得分:0)

您可以扩展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()的每个函数中调用它)