1

ユーザーが既に存在するかどうかを検証しようとしています。ユーザー名のエラー出力は常に「このユーザー名は既に使用されています。」です。

jQuery 検証:
uniqueUsername を除くすべての検証エラーが機能します (必須、最小長、最大長、文字のみが正常に機能しています)。

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

controllers/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;
    }
}
4

2 に答える 2

2

引用OP
" models/users.php-この関数は配列を取得し、このユーザー名がデータベースにすでに存在するかどうかをチェックします。存在する場合は-> true、そうでない場合は->false。"

したがって、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 msgreturn 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'
    }
}
于 2013-02-18T22:54:29.327 に答える
0

なぜリモートメソッドを使用しないのですか? ここにいくつかの例があります

そうすれば、独自のメソッドを作成する必要がなくなり、そのようにルールを指定するだけで済みます。あなたの check_user ページはユーザー名フィールドの内容を渡され、true または false という単語だけを返す必要があります。

rules : {
 username : {
  required : true,
  minlength : 3,
  maxlength : 25,
  lettersonly : true,
  remote: "<?php echo base_url();?>user/check_user"
 },
},
于 2013-02-19T13:22:50.710 に答える