2013-02-18 80 views
1

我試圖驗證用戶是否已經存在與否。用戶名的錯誤輸出始終爲「此用戶名已被佔用。」。jQuery.validator.addMethod總是在CodeIgniter中返回true

jQuery驗證:
所有驗證錯誤的工作除了uniqueUsername(需要使用MINLENGTH,最大長度,lettersonly工作正常)。

jQuery.validator.addMethod("lettersonly", function(value, element) { 
    return this.optional(element) || /^[a-z]+$/i.test(value); 
}, "Please enter only letters"); 


$.validator.addMethod("uniqueUsername", function(value, element) { 
    $.ajax({ 
     type : "POST", 
     url : "<?php echo base_url();?>user/check_user", 
     data : "username=" + value, 
     dataType : "html", 
     success : function(msg) { 
      if (msg == 'true') { 
       return true; 
      } else { 
       return false; 
      } 
     } 
    }) 
}, "This username is already taken."); 

$("#form").validate({ 
    rules : { 
     username : { 
      required : true, 
      minlength : 3, 
      maxlength : 25, 
      lettersonly : true, 
      uniqueUsername : true 
     }, 
    }, 

    messages : { 

     username : { 
      required : "Username is required.", 
     }, 
    }, 

    errorElement : "span", 
    errorPlacement : function(error, element) { 
     error.appendTo(element.parent()); 
    } 
}); 

控制器/ user.php的:
函數check_user()發送的用戶名中的陣列,以我的模型的用戶。我已經測試過這個功能,它的工作原理應該是這樣的。

public function check_user() { 
    $this -> load -> model('users'); 
    $user = array('username' => $this -> input -> post('username')); 
    if ($this -> users -> is_user_username($user)) { 
     echo "true"; 
    } else { 
     echo "false"; 
    } 
} 

型號/ users.php
這個函數接受陣列並檢查該用戶名在我的數據庫已經存在,如果是這樣 - > true,否則 - >假。

public function is_user_username($user) { 
    $this -> db -> where('username', $user['username']); 
    $query = $this -> db -> get('users'); 
    if ($query -> num_rows() == 1) { 
     return true; 
    } else { 
     return false; 
    } 
} 

回答

1

報價OP
models/users.php - 這個函數,如果這用戶名已經存在於我的數據庫陣列並檢查它 - >真,否則 - >假。 「

所以那麼你uniqueUsername方法的邏輯是倒退:

success : function(msg) { 
    if (msg == 'true') { // <-- if username exists 
     return true;  // <-- this means 'passed- no error' 
    } else { 
     return false; // <-- since you did not get a match, it shows error 
    } 
} 

的自定義驗證內的return false方法是什麼觸發錯誤消息。

換句話說,return false ==>「驗證失敗,顯示錯誤消息」

你的PHP邏輯,按照自己的PHP函數的描述,將返回falsesuccessmsg ,這會導致條件邏輯失敗,因此會給出return false,這是觸發錯誤消息的原因。

試試這個...

success : function(msg) { 
    if (msg == 'true') { // <-- if username exists 
     return false; // <-- this means 'failed- show message' 
    } else { 
     return true;  // <-- this means 'passed- no error' 
    } 
} 
0

爲什麼不使用遠程方法?有幾個例子here

這樣,你不必編寫自己的方法,你可以像這樣指定規則。您的check_user頁面將傳遞用戶名字段的內容,並且應該返回單詞true或false

rules : { 
username : { 
    required : true, 
    minlength : 3, 
    maxlength : 25, 
    lettersonly : true, 
    remote: "<?php echo base_url();?>user/check_user" 
}, 
},