我正在进入这个项目的中间,所以我不得不做一些重写,因为代码很粗糙。我正在使用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);
}
}
答案 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)
在服务器端脚本上,尝试返回true
或false
而不是available
和notavailable
,因为这两个字符串都等同于true
。
答案 4 :(得分:-1)
我的代码:
$( "#myform" ).validate({
rules: {
EMAIL: {
remote: {
type: "post",
url: "checkMail.php",
data:{checkUsername:function(){return $("#EMAIL").val()}
}
}
}
},messages:{EMAIL:{remote: "Already taken!"}}
});