如何强制jQuery Validate检查数据库中的重复用户名?

时间:2011-05-24 23:06:21

标签: javascript jquery validation jquery-validate

我正在进入这个项目的中间,所以我不得不做一些重写,因为代码很粗糙。我正在使用jQuery 1.6.1和Validate 1.8.1。

首先,这是运行后端的PHP( dbquery.php ):

include("../includes/dbconnection.php");
session_start();

$location='';
$action='';
if($_GET['action']=='')
    $action=$_POST['action'];
else
    $action=$_GET['action'];

if($action=='checkusername'){
    $error='';
    $username=$_GET['username'];
    // exclude denied account
    $checkuserquery=mysql_query("Select * from database_users as user LEFT OUTER JOIN  database_approval as approval on user.user_id=approval.approval_user_id  where (approval.approval_status IS NULL or approval.approval_status <> 4) and user_username='".$username."'");
    $checkuserresult=mysql_numrows($checkuserquery);
    if($checkuserresult>0) {
        $error = 'false';
    } else {
        $error = 'true';
    }
    echo $error;
} 

我正在尝试使用jQuery Validate脚本在运行时查询数据库中的现有用户名。我要么得到两个极端:它永远不会起作用,或者总是在给定的用户名时吐出来。

我认为问题是我无法获取用户名变量的输入值。当我在alert (username)中创建function (output)时,它什么都不返回。我的假设是.val()仅在页面加载时起作用,因此我输入的任何内容都因某些原因而无效。

这是我在网上重新编写和复制的jQuery:

$(document).ready(function(){

$.validator.addMethod("checkAvailability",function(value,element){
    var username = $("#username").val();
    $.ajax({
          url: "dbquery.php",
          type: "GET",
          async: false,
          data: "action=checkusername&username="+username,
          success: function(output) {
                     return output;
         }
     });
},"Sorry, this user name is not available");

// jQuery Validation script
    $("#signup").validate( {
        rules: {
            username: {
                required: true,
                minlength: 5,
                checkAvailability: true // remote check for duplicate username
            },
        },
        messages: {
            username: {
                required: "Enter a username"
            }
        },
        submitHandler: function(form) {
            form.submit();
        }
    });

});

我只是jQuery的初学者,但是这个代码让我的手很脏。我是在正确的轨道上还是应该在remote:rules下使用username?我被告知remote方法不起作用,因为我试图验证输入值的动态特性。

我遇到的另一个主要问题是当数据库中已存在用户名时,只显示远程错误消息。不幸的是,它显示dbquery.php是以true还是false的形式返回。如果我尝试使用现有用户名,则返回false,然后我重写一个返回true的新用户名,该消息不会消失。同样,当我写一个用户名并返回true时,我仍然收到远程错误消息。

原始编码员引用getXMLHTTP并使用ActiveXObject。他编写的方法似乎有点过时,所以我试图使代码更现代化并清理它。

5/25 - 我正在编辑这个以包含OLD原始JavaScript代码,但它正在使用我想要离开的过时方法(我已经删除了以下代码和替换为上面的jQuery

function getXMLHTTP() { //function to return the xml http object
    var xmlhttp=false;    
    try{
        xmlhttp=new XMLHttpRequest();
    }
    catch(e)    {        
        try{            
            xmlhttp= new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch(e){
            try{
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch(e1){
                xmlhttp=false;
            }
        }
    }

    return xmlhttp;
}
//validate username
function validateUsername(username){
    var strURL="dbquery.php?action=checkusername&username="+username;
    var req = getXMLHTTP();        
    if (req) {            
        req.onreadystatechange = function() {
            if (req.readyState == 4) {
                // only if "OK"
                if (req.status == 200) {          
                    if(req.responseText=='notavailable'){
                        document.getElementById("errorusername").style.display="block";
                        document.getElementById("errorusername").innerHTML="<div id=\"errors\"><strong>"+username+"</strong> is already taken by another user.</div>";
                        error = true;
                    }
                    else{
                        error = false;
                        document.getElementById("errorusername").style.display="none";   
                    }

                } else {
                    alert("There was a problem while using XMLHTTP:\n" + req.statusText);
                }
            }                
        }            
        req.open("GET", strURL, true);
        req.send(null);
    }     
}

5 个答案:

答案 0 :(得分:4)

检查调用函数何时被调用,username的值是什么以及output的值是什么:是true还是"true"

我猜后者:一个字符串,所以你可以这么做:

return output === "true" ? true : false; // I sincerely recommend using === here

因为return "false";会评估为true,因为它是一个非空字符串 - yay动态langauges! :/

remote的示例:

$("#signup").validate( {
    rules: {
        username: {
            required: true,
            minlength: 5,
            remote: {
                url: "dbquery.php",
                type: "get",
                data: {
                    action: function () {
                        return "checkusername";
                    },
                    username: function() {
                        var username = $("#username").val();
                        return username;
                    }
                }
            }
        }
    },
    messages: {
        username: {
            required: "Enter a username"
        }
    },
    submitHandler: function(form) {
        form.submit();
    }
});

要设置自定义错误消息,您的PHP文件必须返回消息而不是false,因此在PHP文件中回显"Sorry, this user name is not available"

答案 1 :(得分:1)

添加 addMethod 时,您应该从服务器端返回 true false

并且该值必须从addMethod返回。

就像这样

$.validator.addMethod("checkAvailability",function(value,element){
    var parameter="action=checkusername&username="+username;
    $.ajax({
          url: "dbquery.php",
          type: "POST",
          async: false,
          data: parameter
          success:function(output)
                 {
                    return output
                 }
     });
},"Sorry, this user name is not available");

答案 2 :(得分:1)

我遇到了同样的问题,但我发现最简单的解决方案只是在通过php编码到json后返回true或false。

if ($users->username_exists())
{
    echo json_encode(FALSE);
}else{
    echo json_encode(TRUE);
}

答案 3 :(得分:0)

在服务器端脚本上,尝试返回truefalse而不是availablenotavailable,因为这两个字符串都等同于true

答案 4 :(得分:-1)

我的代码:

$( "#myform" ).validate({
  rules: {
    EMAIL: {
      remote: {
        type: "post",  
        url: "checkMail.php",           
        data:{checkUsername:function(){return $("#EMAIL").val()}            
        }
      }
    }
  },messages:{EMAIL:{remote: "Already taken!"}}
});