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

Posted

技术标签:

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

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

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

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

请帮忙? :)

【问题讨论】:

【参考方案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() 的每个函数中调用它)

【讨论】:

以上是关于CodeIgniter - 使用重定向重新填充无效表单的主要内容,如果未能解决你的问题,请参考以下文章

使用 Codeigniter 重定向 SEO 友好的 url?

在 Codeigniter 中重定向后会话丢失

如何使用 Codeigniter 在自定义 404 页面中重定向 404 错误?

来自表单输入的 CodeIgniter 重定向

在 CodeIgniter 中重定向整个站点不起作用

PHP | Codeigniter 重定向 |无法修改标头信息