如何强制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脚本动态查询数据库中现有的用户名。我或者遇到两个极端:它永远不起作用,或者总是返回给定的用户名。 我相信问题是我无法获取用户名变量的输入值。当我在
function (output)
中创建
alert (username)
时,它什么也不返回。我的假设是
.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的初学者,但是这段代码使我的手变得很脏。我是在正确的轨道上还是应该在
rules
username
下使用
remote:
?有人告诉我
remote
方法不起作用,因为我要验证的输入值具有动态特性。 我遇到的另一个主要问题是仅当用户名已存在于数据库中时才显示远程错误消息。不幸的是,它显示dbquery.PHP是否以
true
false
返回。如果尝试使用现有的用户名,则返回“ 10”,然后重写新的用户名,返回“ 9”,该消息不会消失。同样,当我写一个用户名并返回“ 9”时,我仍然收到远程错误消息。 原始编码器引用
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);
    }     
}
    

解决方法

检查何时调用验证函数,
username
的值和and18ѭ的值是什么::9ѭ或
\"true\"
? 我猜是后者:一个字符串,所以您可以这样做:
return output === \"true\" ? true : false; // I sincerely recommend using === here
因为如果您将
return \"false\";
评估为
true
,因为它是一个非空字符串-是动态语言! :/
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文件中回显26。     ,添加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\");
    ,我遇到了同样的问题,但是我发现最简单的解决方案是在通过php编码为json后返回true或false。
if ($users->username_exists())
{
    echo json_encode(FALSE);
}else{
    echo json_encode(TRUE);
}
    ,在服务器端脚本上,尝试返回
true
false
而不是
available
notavailable
,因为这两个字符串都等效于
true
。     ,我的代码:
$( \"#myform\" ).validate({
  rules: {
    EMAIL: {
      remote: {
        type: \"post\",url: \"checkMail.php\",data:{checkUsername:function(){return $(\"#EMAIL\").val()}            
        }
      }
    }
  },messages:{EMAIL:{remote: \"Already taken!\"}}
});