如何强制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) 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:根据rulesusername ? 我被告知remote方法不起作用,因为我试图validation输入值的动态特性。

我遇到的另一个主要问题是当数据库中已存在用户名时,只显示远程错误消息。 不幸的是,它显示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="
"+username+" is already taken by another user.
"; 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的值是什么以及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"

在添加addMethod时,您应该从服务器端返回truefalse

并且该值必须从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); } 

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

我的代码:

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