JQuery的Ajax和PHP表单提交

问题描述:

我一直在处理登录表单,它使用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

ajaxsuccess从服务器返回HTTP 200(换句话说,返回正确的响应时),将会触发回调。因此,这意味着无论您的PHP代码中执行哪个代码路径,成功回调仍将被调用,并且用户将被重定向。

您可以修改成功回调来检查响应并采取适当的措施(首选),或在服务器上为返回false方案抛出异常。

+0

你是完全正确的,我最终发现,无论成功函数触发什么,除非它不能实际执行ajax请求。我没有意识到的是我需要使用返回数据来区分结果。我最终将PHP脚本更改为仅回显字符串'true'或'false',然后在客户端比较数据,这取决于PHP脚本的返回结果,并且这给了我所寻找的结果。 感谢您的回答! – 2012-02-14 07:19:31

我认为你需要真正抛出的异常的错误处理程序被称为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