2012-04-10 42 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; 
     } 
    } 
});