2013-04-03 75 views
1

我有以下控制器,它在验证窗体和显示错误方面工作正常。CodeIgniter窗体验证错误重定向

用户试图从登录:http://mydomain.com/index.php/login

然而,当用户输入错误的凭证,它正确地加载登录视图(因为它应该),并显示错误“无效登录”正常,但URI在浏览器窗口中显示:

http://mydomain.com/index.php/verify_login(与上面相反)。

如何在验证失败后,重定向到只是 “.../index.php文件/登录”

这里是有问题的代码:

<? 
    class Login extends CI_Controller { 

public function index() 
{ 
    $this->load->helper(array('form')); 
    $this->load->helper('url'); 
    $this->load->view('login_page'); 
} 

function verify_login() 
{ 

$this->load->model('login_model','',TRUE); 
$this->load->library('form_validation'); 
$this->form_validation->set_error_delimiters('<label class="error">', '</label>'); 
$this->form_validation->set_rules('username', 'Login', 'trim|required|xss_clean'); 
$this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|callback_check_database'); 

if($this->form_validation->run() == FALSE) 
{ 
//Field validation failed. User redirected to login page 
$this->index(); 
} 
else 
{ 
//Go to private area 
redirect('private_area', 'refresh'); 
} 

} 

function check_database($password) 
{ 
    //Field validation succeeded. Validate against database 
    $username = $this->input->post('username'); 

    //query the database 
    $result = $this->login_model->login($username, $password); 

    if($result) 
    { 
    $sess_array = array(); 
    foreach($result as $row) 
    { 
    $sess_array = array(
    'id' => $row->id, 
    'username' => $row->username 
    ); 
    $this->session->set_userdata('logged_in', $sess_array); 
} 
return TRUE; 
} 
else 
{ 
$this->form_validation->set_message('check_database', '<div class="alert alert-error">Invalid username or password</div>'); 
return false; 
} 
} 
} 

UPDATE: Cyrode的解决方案修复该问题,但现在它不会在加载视图时从check_database()函数显示“无效登录”错误消息(set_message)。任何想法我在这里做错了吗?

更新2: 在这里你去:

class Login extends CI_Controller { 

public function index() 
{ 
    $this->load->helper(array('form')); 
    $this->load->helper('url'); 
    $this->load->view('login_page'); 

    $this->load->model('login_model','',TRUE); 
    $this->load->library('form_validation'); 
    $this->form_validation->set_error_delimiters('<label class="error">', '</label>'); 
    $this->form_validation->set_rules('username', 'Login', 'trim|required|xss_clean'); 
    $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|callback_check_database'); 

if($this->form_validation->run() == FALSE) 
    { 
    $this->load->view('login_page'); 
    } 
else 
{ 
//Go to private area 
redirect('private_area', 'refresh'); 
} 
} 

function check_database($password) 
    { 
    //Field validation succeeded. Validate against database 
    $username = $this->input->post('username'); 

    //query the database 
    $result = $this->login_model->login($username, $password); 

    if($result) 
    { 
    $sess_array = array(); 
    foreach($result as $row) 
    { 
    $sess_array = array(
    'id' => $row->id, 
    'username' => $row->username 
    ); 
    $this->session->set_userdata('logged_in', $sess_array); 
    } 
    return TRUE; 
} 
else 
{ 
    $this->form_validation->set_message('check_database', '<div class="alert alert-error">Invalid username or password</div>'); 
return false; 
    } 
} 
} 

回答

2

只需做你的表单处理中index()方法。

public function index() 
{ 
    $this->load->model('login_model','',TRUE); 
    $this->load->library('form_validation'); 
    $this->load->helper('url'); 

    $this->form_validation->set_error_delimiters('<label class="error">', '</label>'); 
    $this->form_validation->set_rules('username', 'Login', 'trim|required|xss_clean'); 
    $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|callback_check_database'); 

    if ($this->form_validation->run() == false) 
    { 
     $this->load->view('login_page'); 
    } 
    else 
    { 
     redirect('private_area', 'refresh'); 
    } 
} 

然后,请确保您的表单的动作去login而不是verify_login

顺便说一句,不要xss_clean密码字段,因为它可能会改变它们的值,并且你的用户会想知道为什么他们的完美类型的密码不起作用。无论如何,你应该散列密码,这将消除安全问题。

+0

Hey Cryode,谢谢,这解决了这个问题,但现在它不会在加载视图时从check_database()函数显示“Invalid Login”错误消息。有任何想法吗? – Dodinas

+0

我不知道为什么该功能会停止 - 所有这一切是将相同的代码合并到一个方法,而不是使用两个。也许添加您的当前代码到您的问题。 –

+0

感谢您对xss和hashing的评论。会这样做。 – Dodinas