2012-03-07 43 views
-1

我很確定我錯過了一些非常明顯的東西,但在我眼中我無法弄清楚什麼。空表單驗證工作正常,但是當我在輸入框中輸入任意值並單擊登錄時,它顯示'This is working fine';,所以我有一種感覺,它與我的回調函數有關。CodeIgniter:驗證不停止

我想說明的是這樣的人可以用自己的用戶名和密碼登錄

驗證:

'loginUser' => array(
     array(
      'field' => 'userLoginUsername', 
      'label' => 'Username', 
      'rules' => 'trim|required|xss_clean' 
     ), 
     array(
      'field' => 'userLoginPassword', 
      'label' => 'Password', 
      'rules' => 'trim|required|callback__check_login|xss_clean|sha1' 
     ) 

    )// End of login user array 

回調:

function _check_login($username, $password) 
{ 
    if($this->users_model->login_check($username,$password)) 
    { 
     $this->form_validation->set_message('_check_login', 'Sorry you have entered an incorrect %s '); 
     return FALSE; 
    }else{ 
     return TRUE; 
    } 
} 

控制器:

function login() 
    { 
     if($this->form_validation->run('loginUser') == FALSE) 
     { 
      $data['success'] = ''; 
     }else{ 
      echo 'This is working fine'; 
     } 

     $data['companyName'] = $this->core_model->companyDetails()->coreCompanyName; 
     $data['pageTitle'] = "User Login"; 
     $this->load->view('frontend/assets/header', $data); 
     $this->load->view('frontend/user_login', $data); 
     $this->load->view('frontend/assets/footer'); 

    } 
} 

型號:

function login_check($username, $password) 
    { 
     $this->db->select('userName,userEmail,userPassword'); 
     $this->db->from('users'); 
      $this->db->where('userName', $username, 'userEmail', $username, 'userPassword' , $password, 'userActive', 1); 
     $query = $this->db->get(); 

     if($query->num_rows() == 1) 
     { 
      return TRUE; 
     }else{ 
      return FALSE; 
     } 
    } 

查看:

<h1><?php echo $companyName; echo nbs(1);?> - <?php echo $pageTitle; ?></h1> 

    <div class="formComments"> 
     <p class="error"><?php echo validation_errors();?></p> 
     <p class="success"><?php echo $this->session->flashdata('success'); ?></p> 
     </div> 

<div class="user_login"> 
    <form class="form-inline" method="POST" action="login" > 
     <input type="text" name="userLoginUsername" id="userLoginUsername" class="input-small" placeholder="Username"> 
     <input type="password" name="userLoginPassword" id="userLoginPassword" class="input-small" placeholder="Password"> 
     <button type="submit" class"btn">Login</button> 
     </form> 
    </div> 

回答

2
在你的代碼

如果數據是由模型即TRUE返回回調_check_loginreturn FALSE覈實login()因爲

if($this->users_model->login_check($username,$password)) 
    { 
     $this->form_validation->set_message('_check_login', 'Sorry you have entered an incorrect %s '); 
     return FALSE; 
    } 

因此條件

if($this->form_validation->run('loginUser') == FALSE) 

會成功,它會套裝$data['success'] = '';

爲錯誤輸入或空驗證模型returns FALSE所以

if($this->users_model->login_check($username,$password)) 
    { 
     $this->form_validation->set_message('_check_login', 'Sorry you have entered an incorrect %s '); 
     return FALSE; 
    }else{ 
     return TRUE; /* login check failed control comes here*/ 
    } 

因此

if($this->form_validation->run('loginUser') == FALSE) 
    { 
     $data['success'] = ''; 
    }else{ 
     echo 'This is working fine'; /*control comes here now*/ 
    } 

變化

if($this->users_model->login_check($username,$password)) 

if(!$this->users_model->login_check($username,$password)) 

,它應該工作

希望這有助於

編輯_ _

那麼,就想通了,你缺少可能會產生問題的東西。您在規則陣列

array(
      'field' => 'userLoginPassword', 
      'label' => 'Password', 
      'rules' => 'trim|required|callback__check_login['.$_POST['userLoginUsername'].']|xss_clean|sha1' 
     ) 

在設置回調必須

array(
      'field' => 'userLoginPassword', 
      'label' => 'Password', 
      'rules' => 'trim|callback__check_login['.$_POST['userLoginUsername'].']|xss_clean|sha1' 
     ) 

因爲回調函數需要2個值,並且使用它只是密碼字段發送給它的方式。也用這個重新排列回調參數到

function _check_login($password, $username) 

所以第一個值是密碼,第二個是用戶名。檢查「userActive」從where子句中取出,並檢查它的值,如果查詢返回的一些記錄

if($query->num_rows() == 1){ 
    /* check its value if 1 do something as you asked in comment*/ 
+0

嘿,我試過了,但它似乎沒有通過任何登錄值,只是給check_login。我還更新了我的問題模型,因爲如果帳戶處於活動狀態,我希望帳戶登錄。如果該帳戶未處於活動狀態,我將如何處理該帳戶。那是否會使用if else(value)? – 2012-03-08 01:19:26

-1

它看起來像這條線的位置:

if($this->form_validation->run('loginUser') == FALSE) 

您應該雷莫ve'loginUser'或者彈出一個變量,比如$ loginUser,對你的數組感覺很有趣。

+0

嘿,這是正確的在這裏看到http://codeigniter.com/user_guide/libraries/form_validation.html#savingtoconfig – 2012-03-07 04:53:13

2

好吧,這是一個很大的代碼,但我看準了這一點:

在你的控制器使用驗證規則來檢查正確的用戶數據;除此之外,我不會這樣做,因爲正確地說,它不是一個「表單驗證」規則,我所看到的是,如果您的用戶存在並且他的憑證是正確的,則返回TRUE。

這很好,但在你的驗證規則,你必須:

if($this->users_model->login_check($username,$password)) 
    { 
     $this->form_validation->set_message('_check_login', 'Sorry you have entered an incorrect %s '); 
     return FALSE; 

這measn當模型返回TRUE(用戶是確定的),您的驗證返回FALSE!這意味着當用戶正確時,您的驗證不成功,並且當您的用戶「錯誤」(請參閱​​您的「隨機輸入」)時,該規則返回TRUE,使其成功。

我現在沒有時間再看,但是瀏覽代碼除此之外,一切看起來都不錯。所以,只要把上面一行

if(!$this->users_model->login_check($username,$password)) 
    { 

即「如果模型返回FALSE,讓規則返回FALSE太」。希望它是明確的。

+0

嘿,我試過了,但它似乎沒有通過任何登錄值,只是給check_login。我還更新了我的問題模型,因爲如果帳戶處於活動狀態,我希望帳戶登錄。如果該帳戶未處於活動狀態,我將如何處理該帳戶。那是否會使用if else(value)? – 2012-03-08 01:18:24