2010-05-27 108 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

相關問題