【问题标题】:jQuery.validator.addMethod always returning true in CodeIgniterjQuery.validator.addMethod 在 CodeIgniter 中总是返回 true
【发布时间】:2013-02-18 21:22:34
【问题描述】:

我正在尝试验证用户是否已经存在。用户名的错误输出总是“此用户名已被占用。”。

jQuery 验证:
除了 uniqueUsername(required、minlength、maxlength、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";
    }
}

models/users.php
此函数获取数组并检查此用户名是否已存在于我的数据库中,如果存在 -> true,否则 -> false。

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;
    }
}

【问题讨论】:

    标签: php codeigniter jquery jquery-validate


    【解决方案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 逻辑将 false 返回到 success msg,这使您的条件逻辑失败,因此给出了 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'
        }
    }
    

    【讨论】:

      【解决方案2】:

      为什么不使用远程方法?有几个例子here

      这样你就不必编写自己的方法,你可以像这样指定规则。您的 check_user 页面将传递用户名字段的内容,并且应该只返回单词 true 或 false

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-23
        • 2021-11-16
        • 1970-01-01
        • 2013-08-06
        • 2017-05-10
        • 2013-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多