2013-02-18 82 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" 
}, 
},