2010-05-27 109 views
2

我有一个用户注册表单。我正在通过AJAX进行服务器端验证。我的问题的快速总结是,在验证2个字段时,第二个字段验证出错。如果我评论第一个字段,那么第二个字段不会显示任何错误。它有这种奇怪的行为。下面详细信息:PHP,MySQL,jQuery,AJAX:json数据返回正确的响应,但前端返回错误

的HTML,JS和PHP代码都低于:

HTML表单:

<form id="SignupForm" action=""> 
      <fieldset> 
       <legend>Free Signup</legend> 
       <label for="username">Username</label> 
       <input name="username" type="text" id="username" /><span id="status_username"></span><br /> 
       <label for="email">Email</label> 
       <input name="email" type="text" id="email" /><span id="status_email"></span><br /> 
       <label for="confirm_email">Confirm Email</label> 
       <input name="confirm_email" type="text" id="confirm_email" /><span id="status_confirm_email"></span><br /> 
      </fieldset> 
      <p> 
       <input id="sbt" type="button" value="Submit form" /> 
      </p>  

      </form> 

JS:

<script type="text/javascript"> 

$(document).ready(function() 
{ 

    $("#email").blur(function() 
    { 
     var email = $("#email").val(); 
     var msgbox2 = $("#status_email"); 

     if(email.length > 3) 
     {   
      $.ajax({ 
       type: 'POST',  
       url: 'check_ajax2.php',   
       data: "email="+ email, 
       dataType: 'json', 
       cache: false,       
       success: function(data) 
       {      
         if(data.success == 'y') 
         { 
          alert('Available'); 
         } 
         else 
         { 
          alert('Not Available'); 
         }  
       } 
      }); 
     }  

     return false; 
    }); 


    $("#confirm_email").blur(function() 
    { 
     var confirm_email = $("#confirm_email").val(); 
     var email = $("#email").val(); 
     var msgbox3 = $("#status_confirm_email");   

     if(confirm_email.length > 3) 
     { 

      $.ajax({ 
       type: 'POST',  
       url: 'check_ajax2.php',   
       data: 'confirm_email='+ confirm_email + '&email=' + email, 
       dataType: 'json', 
       cache: false,       
       success: function(data) 
       {  
         if(data.success == 'y') 
         { 
          alert('Available'); 
         } 
         else 
         { 
          alert('Not Available'); 
         }  

       } 
       , error: function (data) 
       { 
        alert('Some error'); 
       } 

      }); 
     }  

     return false; 
    });   
}); 


</script> 

PHP代码:

<?php //check_ajax2.php 


if(isset($_POST['email'])) 
{ 
    $email = $_POST['email']; 


    $res = mysql_query("SELECT uid FROM members WHERE email = '$email' "); 
    $i_exists = mysql_num_rows($res); 

    if(0 == $i_exists) 
    { 
     $success = 'y'; 
     $msg_email = 'Email available'; 
    } 
    else 
    { 
     $success = 'n'; 
     $msg_email = 'Email is already in use.</font>'; 
    } 

    print json_encode(array('success' => $success, 'msg_email' => $msg_email)); 
} 

if(isset($_POST['confirm_email'])) 
{ 
    $confirm_email = $_POST['confirm_email']; 
    $email = (isset($_POST['email']) && trim($_POST['email']) != '' ? $_POST['email'] : ''); 



    $res = mysql_query("SELECT uid FROM members WHERE email = '$confirm_email' "); 
    $i_exists = mysql_num_rows($res); 


    if(0 == $i_exists) 
    { 
     if(isset($email) && isset($confirm_email) && $email == $confirm_email) 
     { 
      $success = 'y'; 
      $msg_confirm_email = 'Email available and match'; 
     } 
     else 
     { 
      $success = 'n'; 
      $msg_confirm_email = 'Email and Confirm Email do NOT match.'; 
     }  
    } 
    else 
    { 
     $success = 'n'; 
     $msg_confirm_email = 'Email already exists.'; 
    } 

    print json_encode(array('success' => $success, 'msg_confirm_email' => $msg_confirm_email)); 
} 

?> 

问题:

只要我确认在check_ajax2.php文件$_POST['email']以及$_POST['confirm_email'],为confirm_email现场验证总是返回一个错误。用我有限的Firebug的知识,但是,我也发现,下面分别答复,当我进入的领域电子邮件和confirm_email:

RESPONSE 1: {“成功”:“Y”,“msg_email “:” 通过电子邮件将可用的 “}

RESPONSE 2: {” 成功 “:” Y “ ”msg_email“: ”通过电子邮件将可用的“} { ”成功“: ”N“, ”msg_confirm_email“:” 电子邮件和确认电子邮件不匹配。“}

虽然RESPONSE 2显示我们通过msg_confirm_email收到正确的消息,但从第nt结束时,弹出警报“Some error”(我启用了调试警报)。我花了48小时试图尽可能地改变代码的每一部分,但只取得了很小的成功。有什么奇怪的是,如果我完全评论$_POST['email']字段的验证,那么验证$_POST['confirm_email']字段显示正确无误。如果我启用它,它会正确验证电子邮件字段,但是当它到达验证confirm_email字段的位置时,它会再次向我显示错误。

我也尝试在check_ajax2.php页面中将重命名成功变量改为$_POST['email']$_POST['confirm_email']的其他不同名称,但没有成功。我将在表单中添加更多字段并在check_ajax2.php页面中进行验证。所以我不打算使用不同的Ajax页面来验证每个字段(我认为这样做并不明智)。我不是一个jQuery或AJAX大师,所以所有帮助解决这个问题是高度赞赏。

预先感谢您。

回答

2

如果HTTP状态码指示错误以及解析响应失败,则会调用错误处理程序。

我认为您的错误处理程序在接收到RESPONSE 2时被调用,因为{"success":"y","msg_email":"Email available"}{"success":"n","msg_confirm_email":"Email and Confirm Email do NOT match."}不是有效的JSON。您可以使用验证器:http://jsonlint.com/

在你的PHP,你可以在上面定义$response_object阵列,并在底部打印json_encode($response_object)

<?php //check_ajax2.php 

$response_object = array('success' => 'y'); 

if(isset($_POST['email'])) 
{ 
    $email = $_POST['email']; 


    $res = mysql_query("SELECT uid FROM members WHERE email = '" . mysql_real_escape_string($email) . "' "); 
    $i_exists = mysql_num_rows($res); 

    if(0 == $i_exists) 
    { 
     $msg_email = 'Email available'; 
    } 
    else 
    { 
     $response_object['success'] = 'n'; 
     $msg_email = 'Email is already in use.'; 
    } 

    $response_object['msg_email'] = $msg_email; 
} 

if(isset($_POST['confirm_email'])) 
{ 
    $confirm_email = $_POST['confirm_email']; 
    $email = (isset($_POST['email']) && trim($_POST['email']) != '' ? $_POST['email'] : ''); 



    $res = mysql_query("SELECT uid FROM members WHERE email = '" . mysql_real_escape_string($confirm_email) . "' "); 
    $i_exists = mysql_num_rows($res); 


    if(0 == $i_exists) 
    { 
     if(isset($email) && isset($confirm_email) && $email == $confirm_email) 
     { 
      $msg_confirm_email = 'Email available and match'; 
     } 
     else 
     { 
      $response_object['success'] = 'n'; 
      $msg_confirm_email = 'Email and Confirm Email do NOT match.'; 
     }  
    } 
    else 
    { 
     $response_object['success'] = 'n'; 
     $msg_confirm_email = 'Email already exists.'; 
    } 

    $response_object['msg_confirm_email'] = $msg_confirm_email; 
} 

print json_encode($response_object); 

注意,我添加了调用mysql_real_escape_string,以帮助防止SQL注入。

+0

+1。丹尼尔,非常感谢你的解决方案。它像一个魅力。此外,我尝试了你给我的验证json响应的链接,但是当我点击验证按钮时,它给了我解析失败的结果。我给了它一个{“成功”的输入:“y”,“msg_email”:“电子邮件可用”} {“成功”:“n”,“msg_confirm_email”:“电子邮件和确认电子邮件不匹配。”}。我做对了吗?对不起,我是一个全新的链接,你给了我,因此问题。 – Devner 2010-05-27 20:57:58

+0

我很高兴它的工作!是的,你做的是正确的事情。它表示“解析失败”,因为字符串“{”success“:”y“,”msg_email“:”电子邮件可用“} {”success“:”n“,”msg_confirm_email“:”电子邮件和确认电子邮件不匹配。 “}'不是有效的JSON。基本上,如果jsonlint网站显示“解析失败”,那么您知道jQuery将调用您的错误处理程序。 – 2010-05-27 21:21:31

+0

非常感谢您花时间解释它。欣赏它。此外,我只是想知道,如果你知道我可以用来缩短各个领域的PHP错误检查代码的方法吗?我的意思是,目前对于需要验证的每个字段,我将不得不在JS和PHP处理中添加相应的代码。那么是否有任何方法可以让JS(首选)和PHP中的代码变得简单,以验证这些代码而无需分别为它们分别编写代码?如果有任何问题,请告诉我。单击代码和错误检查已经太麻烦了! – Devner 2010-05-27 22:03:52

相关问题