代码之家  ›  专栏  ›  技术社区  ›  Community wiki

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

  •  3
  • Community wiki  · 技术社区  · 1 年前

    我正在进行这个项目,所以由于代码草率,我不得不重新编写一些内容。我使用的是jQuery 1.6.1和Validate 1.8.1。

    首先,这里是运行后端的PHP( 数据库查询.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;
    } 
    

    我正在尝试使用jQueryValidate脚本来动态查询数据库中的现有用户名。我要么得到两个极端:它永远不起作用,要么它总是把给定的用户名作为已取用户名。

    我认为问题在于我无法获取username变量的输入值。当我创建 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 。如果我尝试现有用户名,它会返回 虚假的 ,然后我重写一个新用户名,该用户名返回 真的 ,信息不会消失。类似地,当我编写用户名时,它返回 真的 ,我仍然收到远程错误消息。

    原始编码器引用 getXMLHTTP 和使用 ActiveXObject 。他编程的方法似乎有点过时了,所以我试图让代码更现代一点,并将其清理干净。

    5/25- 我正在编辑它,以包括旧的原始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 回复  |  直到 11 年前
        1
  •  5
  •   Frits van Campen    13 年前

    检查验证函数何时被调用 username 的价值是什么 output 是:是吗 true "true" ?

    我猜是后者:一根绳子,所以你可以做:

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

    因为如果你 return "false"; 将评估为 真的 因为它是一个非空字符串-yay动态语言!:/

    示例 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,因此echo "Sorry, this user name is not available" 在您的PHP文件中。

        2
  •  2
  •   Mahesh KP    13 年前

    当您添加 addMethod 你应该回来 真的 虚假的 来自服务器端。

    并且该值必须从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");
    
        3
  •  1
  •   Sharp Coders    12 年前

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

    if ($users->username_exists())
    {
        echo json_encode(FALSE);
    }else{
        echo json_encode(TRUE);
    }
    
        4
  •  0
  •   minboost    13 年前

    在服务器端脚本上,尝试返回 true false 而不是 available notavailable ,因为这两个字符串都等效于 真的

        5
  •  -1
  •   gokhan    9 年前

    我的代码:

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