你好,我在codeigniter中有两条路线:
$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中发布表单。出现表单验证错误
答案 0 :(得分:1)
在CodeIgniter中发布到相同的网址
您已经描述了一种常见情况。您要使用表单加载页面,执行POST请求,验证请求,然后在出现问题时显示错误。如果执行此操作,则需要注意一些潜在问题:
这两个问题均呈现重复的发布问题,这是绝对不希望的。解决此问题的方法是使用表单令牌。在加载存在表单的页面期间会生成一个表单令牌。该值通常是一个随机的字符串,放在两个位置:
发布表单时,隐藏表单字段中的令牌值将与其余发布的数据一起传递。由于存在包含相同值的会话或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的目标。