2011-03-03 164 views
5

我有一个jQuery远程验证的问题。我正在检查电子邮件是否被注册,远程验证是否有效,但它只显示值 - 真或假,我不能提交表格。jQuery远程验证

jQuery代码:

$("#form").validate({ 
    rules: { 
    email: { 
     required: true, 
     email: true, 
     remote: "check-email.php" 

    } 
    } 
}); 

检查mail.php代码:

$email = trim(strtolower($_REQUEST['email'])); 


$checkemail = mysql_query("SELECT * FROM users WHERE email = '".$email."'"); 

if(mysql_num_rows($checkemail) == 1) 
{ 
$valid = 'false'; 
} 
else 
{ 
$valid = 'true'; 
} //end of $checkemail if statemant 


echo json_encode($valid); 

回答

12
$checkemail = mysql_query("SELECT * FROM users WHERE email = '".$email."'"); 

永远不要永远永远做到这一点。这是asking for trouble:SQL注入,随机错误(单引号在电子邮件地址中有效,BTW)。

parameterized queries,使用它们。这只是代码的几行,但它与谷仓门之类的安全缺陷和安全的数据库交互之间的差异。

if(mysql_num_rows($checkemail) == 1) 
{ 
$valid = 'false'; 
} 
else 
{ 
$valid = 'true'; 
} 

是说

$valid = mysql_num_rows($checkemail) == 1; 

根据该文档的一个非常冗长的方式,远程确认的响应是JSON编码布尔,而不是一个JSON编码

你有"true""false",这将成为"\"true\"""\"false\""通过json_encode(),这是不对的。实际的truefalse将变为"true""false",这是正确的。

设置响应内容类型为JSON也可能是一个好主意:

header('Content-type: application/json'); 
+1

无用的语义,但它扔了我一秒。我想你想要:'$ valid = mysql_num_rows($ checkemail)== 0;' – 2011-10-26 01:57:55

+0

@Kijana我不确定这里的“无用语义”是什么。不,那不是我的意思。 – Tomalak 2011-10-26 06:51:36

+0

“无用的语义”是我把它提出来。 '$ valid = mysql_num_rows($ checkemail)== 1;' - 当它等于1时,'$ valid'不会是'true',这与OP代码相反。 – 2011-11-10 22:43:45

1

这可能需要一个布尔值时,可以只返回一个字符串。也许尝试以下操作:

if(mysql_num_rows($checkemail) == 1) 
{ 
$valid = false; 
} 
else 
{ 
$valid = true; 
} 
1

对于谁是不能够得到远程验证使用上述技术的工作,下面是我的两分钱的人其中可以帮助确保您正确运行。

1)。它仅适用于v1.6.1及更高版本。坚持最新版本的jQuery http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js

2)。选择'同步'远程执行,默认为异步。将async设置为false。

$("#form").validate({ 
    rules: { 
    email: { 
     required: true, 
     email: true, 
     remote: { url:"check-email.php", async:false } 
    } 
    } 
});