2013-04-03 78 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