【问题标题】:jQuery Validation plugin addMethodjQuery 验证插件 addMethod
【发布时间】:2011-03-31 07:34:10
【问题描述】:

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

这些是 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;

?>

【问题讨论】:

  • 对于任何对此示例有疑问的人,我在服务器端语言的响应方面遇到了问题,因此我设法通过直接在插件从dataType: "json"dataType: "text" line 1206

标签: php jquery mysql validation


【解决方案1】:

您无法在此处使用自定义方法完成此操作,因为您需要验证插件知道这是一个远程(或更重要的是,一个异步)请求。

幸运的是,它具有内置功能来提供帮助。您可以在此处使用 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
  }
?>

【讨论】:

  • 不错的答案。我不知道remote:。应该想到他们有一些可用于这种情况的东西。 +1
  • 嗨尼克,我已经根据你的方法更改了我的代码,但它对我不起作用。不知何故,错误消息“请输入有效的电子邮件地址”不断出现。我的email规则如下:email:{ required: true, email: true, remote: { url: "availability.php", type: "post" } },我是不是搞错了?
  • @dave - 你的 PHP 代码是否受到攻击?听起来它在点击远程规则之前在email: true 规则上失败了......如果你像上面一样将它添加到messages,它应该会显示不同的错误消息。
  • 我发现了错误。我输入了 mysqli_num_row 而不是 mysqli_num_rows!当我犯这样的错误时,我讨厌它。谢谢尼克!
  • @dave - 欢迎 :) 现在准备好了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多