2010-08-18 85 views
1

我想用下面的代码添加一个新的方法到jQuery验证插件。我的目标是检查电子邮件地址是否已经存在于数据库(MySQL)中。如果是,它会通知用户注册另一个电子邮件地址。不知何故,总是返回的结果是“电子邮件已被采纳”。jQuery验证插件addMethod

这些都是validate.js代码:

$(document).ready(function(){ 
$.validator.addMethod("uniqueEmail", function(value, element) { 
    $.ajax({ 
     type: "POST", 
     url: "availability.php", 
     data: value, 
     success: function(exist) 
     { 
     if(exist>0) { 
     return true; 
     } return false; 
     } 
    }); 
} ,"Email is already taken"); 
$('#signup form').validate({ 
    rules: { 
    firstname: { 
    required: true, 
    minlength:3 
    }, 
    lastname: { 
    required: true, 
    minlength: 3 
    }, 
    affiliation: { 
    required: true, 
    }, 
    occupation: { 
    required: true, 
    }, 
    email: { 
    required: true, 
    email: true, 
    uniqueEmail: true 
    }, 
    password: { 
    minlength: 6, 
    required: true 
    }, 
    repassword: { 
    equalTo: "#password" 
    } 
    }, 
    messages: { 
    firstname: { 
    minlength: "Your first name should be more than 3 characters" 
    }, 
    lastname: { 
    minlength: "Your last name should be more than 3 characters" 
    }, 
    }, 
    success: function(label) { 
    label.text('OK!').addClass('valid'); 
    } 
}); 
}); 

而这些都是在我的PHP文件中的代码:

<?php 

include_once $_SERVER['DOCUMENT_ROOT'] . '/braddclient/includes/magicquotes.inc.php'; 
include $_SERVER['DOCUMENT_ROOT'] . '/braddclient/includes/db.inc.php'; 

$email = strtolower($_POST['email']); 
$email = mysqli_real_escape_string($link, $email); 
$sql = "SELECT * FROM bradduser WHERE email='$email'"; 
$result = mysqli_query($link, $sql); 
$num = mysqli_num_rows($result); 

echo $num; 

?> 
+0

对于这个例子有问题的人,我遇到了服务器端语言的响应问题,所以我设法通过直接在插件中从'ajax'的'dataType'来解决它'dataType:“json”'到'dataType:“text”'on line 1206' – CIRCLE 2014-05-29 11:48:07

回答

3

你不能完全用自定义的方法,因为这样做这里你需要验证插件来知道这是一个远程(或更重要的是一个异步)请求。

幸运的是,它具有帮助的内置功能。取而代之的是自定义的方法,你可以在这里使用remote,所以完全的自定义方法的离开,并改变了这一点:

uniqueEmail: true 

此:

remote: { url: "availability.php", type: "post" } 

的错误信息,那么添加到messages是这样的:

email: { remote: "Email is already taken" } 

而且改变你的PHP端匹配,返回truefalse,像这样:

<?php 
    include_once $_SERVER['DOCUMENT_ROOT'] . '/braddclient/includes/magicquotes.inc.php'; 
    include $_SERVER['DOCUMENT_ROOT'] . '/braddclient/includes/db.inc.php'; 

    $email = strtolower($_POST['email']); 
    $email = mysqli_real_escape_string($link, $email); 
    $sql = "SELECT * FROM bradduser WHERE email='$email'"; 
    $result = mysqli_query($link, $sql); 
    if(mysqli_num_rows($result) > 0) { 
    echo "false"; //validation fails, email in use 
    } else { 
    echo "true"; //validation passes 
    } 
?> 
+0

好的答案。我不知道'remote:'。应该认定他们有这种情况可用的东西。 +1 – user113716 2010-08-18 02:16:17

+0

嗨,尼克,我改变了我的代码根据你的方法,但它不适合我。不知何故,错误消息“请输入一个有效的电子邮件地址”不断出现。我的电子邮件的规则如下: \t \t \t电子邮件:{ \t \t \t \t要求:真实, \t \t \t \t电子邮件:真实, \t \t \t \t远程:{ \t \t \t \t \t url:“availability.php”, \t \t \t \t \t类型: “后” \t \t \t \t} \t \t \t}, 我有没有犯任何错误? – dave 2010-08-18 02:23:03

+0

@dave - 你的PHP代码是否一炮走红?这听起来像是在按下'email:true'规则之前在远程的规则上失败了......如果你将它添加到像上面那样的'messages',它应该显示一个不同的错误消息。 – 2010-08-18 02:26:59