2012-01-27 97 views
1

我一直在處理登錄表單,它使用Jquery和Ajax提交給PHP文件,該文件處理請求然後發送迴應。我認爲在某個地方,某種程度上PHP腳本可能不正確,因爲即使我故意輸入不正確的密碼,該表單總是會返回真實的,以便用戶登錄。JQuery的Ajax和PHP表單提交

下面是HTML代碼:

<div id="login"> 
    <span class="error">Uh oh! Something went wrong please try again!</span> 
    <span class="success">Congrats! You've been logged in, redirecting you to your homepage</span> 
    <form action="process/core/login.php" method="post"> 
    <p>Email: <input type="text" name="email" <?php if($_POST['email'] != '') { echo 'value="'. $_POST['email'] .'"'; }?> /></p> 
    <p>Password: <input type="password" name="pword" /></p> 
    <p><input type="submit" value="Login" id="login-btn" /></p> 
    </form> 
</div> 

<script> 
function redirect(){ 
    window.location = "home.php" 
} 

$("#login-btn").click(function(){ 
    $.ajax({ 
     type:  "post",          // type of post 
     url:  "process/core/login.php",     // submitting file 
     data:  $("form").serialize(),      // data to submit 
     success: function() { 
      $(".success").show("slow");       // sucess function 
      setTimeout('redirect()', 3000); 
     },  
     error: function() { 
      $('.error').show("slow");       // error function 
     } 
    }); 
return false; 
}); 
</script> 

下面是PHP腳本:

<?php 
session_start(); 

require '../../lib/core/connect.php'; 

if(!empty($_POST['email']) && !empty($_POST['pword'])) { 

    $userInfo = mysql_query("SELECT * FROM users WHERE email = '". mysql_real_escape_string($_POST['email']) ."'"); 
    $userInfo = mysql_fetch_assoc($userInfo); 

    if($_POST['email'] == $userInfo['email'] && md5($_POST['pword']) == $userInfo['pword']) { 

     if($userInfo['active'] == 1) { 

      $_SESSION['AuthEmail']=$userInfo['email']; 
      $_SESSION['AuthUid']=$userInfo['uid']; 
      $_SESSION['AuthName']=$userInfo['fname'] . ' ' . $userInfo['lname']; 
      $_SESSION['AuthActive']=$userInfo['active']; 
      $_SESSION['AuthType']=$userInfo['type']; 

      return true; 
      print 'success'; 
     } else { 
      return false; 
      print 'fail not active'; 
     } 
    } else { 
     return false; 
     print 'Email and or password didn\'t match'; 
    } 

} else { 
    return false; 
    print 'Didn\'t enter one of the required values'; 
} 
?> 

帶我有一個錯誤,我甚至改變了所有的PHP腳本的值返回false,不知何故ajax中的成功消息仍然成功解除。任何幫助將不勝感激,我搜索整個論壇查找相關主題,但沒有發現任何事情深入實際的錯誤。

感謝

+1

順便說一下,您的打印下面的返回值不會觸發。 。 。 – 2012-01-27 22:01:00

回答

1

ajaxsuccess從服務器返回HTTP 200(換句話說,返回正確的響應時),將會觸發回調。因此,這意味着無論您的PHP代碼中執行哪個代碼路徑,成功回調仍將被調用,並且用戶將被重定向。

您可以修改成功回調來檢查響應並採取適當的措施(首選),或在服務器上爲返回false方案拋出異常。

+0

你是完全正確的,我最終發現,無論成功函數觸發什麼,除非它不能實際執行ajax請求。我沒有意識到的是我需要使用返回數據來區分結果。我最終將PHP腳本更改爲僅回顯字符串'true'或'false',然後在客戶端比較數據,這取決於PHP腳本的返回結果,並且這給了我所尋找的結果。 感謝您的回答! – 2012-02-14 07:19:31

2

我認爲你需要真正拋出的異常的錯誤處理程序被稱爲http://php.net/manual/en/language.exceptions.php假是不是根本就不是真正的錯誤。

+0

也許用成功/錯誤代碼填寫響應數據也許是一個很好的解決方案呢?我不知道異常的可能性,我不能確定哪種解決方案更爲正確。有任何想法嗎?也許它和bool迴歸和異常拋出困境一樣。 – clime 2012-01-27 22:04:48

+0

我認爲無論哪種方式都是有效的,而且我無法真正想到爲什麼要使用另一種方法。如果錯誤可以通過我認爲的其他代碼恢復,那麼應該拋出一個異常(所以你可以使用一個try catch),並且你會得到一個帶有異常的堆棧跟蹤,而不是隻寫一些東西。也許別人會以這樣或那樣的方式加入。 – shaunhusain 2012-01-27 22:09:17

+0

我有一些過去的PHP經驗,但通常只是在客戶端使用BlazeDS/Java和Flex,所以我在這裏假設錯誤處理程序不會被觸發,除非它實際上是一個異常,而是從使用該設置而不是使用PHP或JQuery我們通常通過拋出一個錯誤來處理錯誤情況,然後在客戶端進行處理,因爲我們得到錯誤事件或成功事件,所以它更有意義。 – shaunhusain 2012-01-27 22:11:29