【问题标题】:CodeIgniter - Repopulating an invalid form w/ redirectCodeIgniter - 使用重定向重新填充无效表单
【发布时间】:2011-12-27 21:41:58
【问题描述】:
我使用Post-Redirect-Get 模式来避免在 POST 提交后刷新页面时出现问题。重定向会清除所有发送的 POST 数据,这意味着我无法使用 set_value() 和相关函数再次填充这些字段。
为了更清楚,这里是它的工作原理。
- 客户端提交的 POST 包含无效数据。
- 发回一个 303 重定向标头。
- 客户端在标头位置执行 GET,但 POST 数据已消失,这意味着无法重新填充表单。
请帮忙? :)
【问题讨论】:
标签:
php
forms
http
validation
codeigniter
【解决方案2】:
一种方法是在重定向之前将 POST 数据存储在会话中,例如如果您的表格是“注册”,那么您可以这样做:
session_start();
$_SESSION['register_form_data'] = array();
foreach($_POST as $key=>$value)
{
$_SESSION['register_form_data'][$key] = $value;
}
现在表单数据将在表单页面上可用。您还可以创建一个 set_value_from_session() 辅助函数来重新填充字段。
【解决方案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() 的每个函数中调用它)