2010-08-18 110 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