你好,我在代码点火器中有两个路由:
$route['register'] = 'Login/Register';
$route['login'] = 'Login/index';
用于显示登录/注册表单
并形成邮政路线:
$route['loginprocess'] = 'Login/LoginProcess';
$route['registerprocess'] = 'Login/RegisterProcess';
没关系,但是在使用form_validation类时
$this->form_validation->set_error_delimiters('<span class="help-block">', '</span>');
$this->form_validation->set_rules('email', 'Email', 'required|valid_email');
$this->form_validation->set_rules('pwd', 'Password', 'required');
if ($this->form_validation->run() == FALSE){
$this->load->view('login');
} else {
validation success
}
问题是当我在表单验证中遇到错误时,它会进入
http://localhost/logincode/loginprocess
所以它对 URL 不友好。 它应该在表单已经显示的相同控制器方法中发布:
http://localhost/logincode/login
那么有没有办法在同一URL中发布表单。 与表单验证错误一起出现
发布到 CodeIgniter 中的同一 URL
您描述了一个常见方案。您希望使用表单加载页面,执行 POST 请求,验证请求,然后在出现问题时显示错误。如果您这样做,有一些潜在的问题需要注意:
- 成功发布后,如果浏览器执行页面刷新会发生什么?
- 成功发布帖子后,如果用户导航到另一个页面,但随后在历史记录中倒退,会发生什么?
这两个问题都存在重复的帖子问题,这是永远不可取的。解决此问题的方法是使用表单令牌。表单令牌是在加载表单所在的页面期间生成的。该值通常是一个随机字符串,它放在两个地方:
- 在表单中作为隐藏表单域。
- 在会话或 Cookie 中。
过帐表单时,隐藏表单字段中的令牌值将与其余已发布数据一起传递。由于存在包含相同值的会话或 cookie,因此要发布到的控制器/方法可以检查它们是否匹配,如果匹配,则可以执行验证,并输出错误或成功消息。在任何情况下,都会生成一个新的表单令牌,因此两个帖子永远不会包含相同的表单令牌。
基本概念摘要
// You of course have to start the
// session for this to work.
$this->load->library('session');
if(
isset( $_POST['token'] ) &&
isset( $_SESSION['token'] ) &&
$_POST['token'] == $_SESSION['token']
){
// Do validation ...
// ...
// If validation passes
if( $this->form_validation->run() ){
$valid = TRUE;
}
// If there were validation errors
else{
$errors = validation_errors();
}
}
if( isset( $errors ) )
{
// Display the errors
}
if( isset( $valid ) )
{
// Display a thank you message
}
// Always refresh the token
$token = substr(md5(uniqid() . microtime() . rand()), 0, 8);
$_SESSION['token'] = $token;
?>
<form method="POST">
<input type="text" name="x" />
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<input type="submit" value="submit" />
</form>
在实践中,代币的这个概念可以更加复杂。例如,您可以选择加密令牌值,然后在检查它们是否匹配时对其进行解密。您还可以在会话/cookie 中创建令牌数组,并根据令牌数组检查已发布的令牌。您可能对如何自定义表单令牌有其他想法,但这里已经介绍了基础知识,我希望它可以帮助您实现在 CodeIgniter 中发布到同一 URL 的目标。