2012-04-10 45 views
4

我已经查看过1000次了。我看不出为什么它不起作用。Ajax/jquery登录表单失败

这是一个简单的ajax登录表单。即使凭据正确,它也会返回false。 (我测试ajax_login.php直接张贴到它)

的Ajax功能:

$(document).ready(function() { 
$("#submit_login").click(function() { 


var username = $("#username").val(); 
var password = $("#password").val(); 

    $.ajax({ 

     type: "POST", 
     url: "scripts/ajax_login.php", 
     data: "username=" + username + "&password=" + password, 
     success: function(result) { 
      if(result == '0') 
      { 
       $(document.location = 'index.php? page=profile&user=' + username); 
      } 
      else 
      { 
       $("#login_error").show("fast"); 
      } 
     } 
    });   
    return false; 
}); 
}); 

ajax_login.php

session_start(); 
require('../conf/config.php'); 

if($_POST) 
{ 

$u = mysql_real_escape_string($_REQUEST['username']); 
$p = md5(mysql_real_escape_string($_REQUEST['password'])); 

$con = mysql_connect($mysql_server,$mysql_user,$mysql_password); 
$db = mysql_select_db($mysql_db); 

$query = mysql_query("SELECT * FROM users WHERE username = '$u' AND password = '$p'"); 

if(mysql_num_rows($query) > 0) 
{ 
    $sid = session_id(); 
    $query = "UPDATE users SET sid='$sid' WHERE username='$u'"; 
    $result = mysql_query($query); 

    if($result) 
    { 
     $_SESSION['loggedin'] = $u; 
     echo '0'; 
    } 
} 
} 

形式:

<div class="login_form"> 
<form action="scripts/ajax_login.php" method="POST"> 
Login<br /><br /> 
Username: <br /> 
<input type="text" name="username" id="username" /> <br /> 
Password: <br /> 
<input type="password" name="password" id="password" /> 
</div> 
<input type="checkbox" name="remember" id="rem" value="checked"/><label for="rem">Stay logged in?</label><br /> 
<?php $formKey->outputKey(); ?> 
    <input type="submit" value="Login!" name="submit" id="submit_login" /> 
    </form> 
+0

试着移动将返回false转化为成功的功能else块。也是你的document.location语法正确吗? – DG3 2012-04-10 19:15:14

+0

如果这些代码是来自实际代码的代码片段,那么它很容易发生SQL注入攻击(在某些情况下,很好:http://stackoverflow.com/questions/1220182/does-mysql-real-escape-string-fully-protect-against -sql注入)。 – dezso 2012-04-10 19:57:21

+0

如果@SimpleCoder的答案是正确的,请确保通过单击复选标记将其标记为正确 - 给出信用在哪里由于感谢人:) – Mattygabe 2012-04-11 11:59:17

回答

3

它总是会返回假,因为$.ajax()(与其他jQuery ajax方法一样)默认情况下是异步操作的。您需要在回调中完成所有事件处理(例如,您的success回调)。

另外,我建议不要这样做:if (result == '0')。相反,使用===

理想情况下,你应该改为返回JSON,或者至少东西是不是真的,假的,0,1,等这四个值(和其他人)可以很容易地当谈到JavaScript的布尔操作相混淆。

不同于 return语句要么你的回调函数( successerror)被称为前执行,它似乎并不认为任何与点击处理函数的返回值做了 $("#submit_login")事实
+1

如果您需要点击处理程序返回false,那么您必须按照建议的@SimpleCoder的方式进行操作,将async AJAX选项设置为false,这会使AJAX调用同步并等待直至成功或错误'被调用。未命名为Firefox的浏览器将“锁定”,因此如果您有任何类型的加载图形,它并不能很好地工作。所以,如果你不需要这个请求是'同步的',那就让你的成功和错误处理程序在请求返回时执行它们的操作。 – Mattygabe 2012-04-10 19:51:56

0

除此之外,可能发生的事情是,虽然您在click事件上进行AJAX调用,但浏览器也提交表单帖子,因为#submit_loginsubmit类型按钮 - 无论是否正在执行AJAX调用,页面都会重新加载表单提交(所以看起来好像click处理程序正在返回false而不是点击您的success处理程序)。将其更改为一个非提交类型按钮:

<input type="button" value="Login!" name="submit" id="submit_login" /> 

有这样做的其他方式,如使用JavaScript的preventDefault在你的处理器,就像这样:

$("#submit_login").click(function(ev) { 
    ev.preventDefault(); 
    //Rest of code... 

正如我以前说过,没有按看起来在这里所有的返回值都被使用了,所以你真的不需要它返回false。不管需求如何,都可以放入处理程序中。

0

未经测试,但你应该试试这个:

$.ajax({ 
    type: "POST", 
    url: "scripts/ajax_login.php", 
    data: {"username":username, "password":password}, 
    success: function(result) { 
     if(result==='0') 
     { 
      $(document.location = 'index.php?page=profile&user='+username); 
     } 
     else 
     { 
      $("#login_error").show("fast"); 
      return false; 
     } 
    } 
});