2012-04-10 3 views
4

Я просмотрел это 1000 раз. Я не понимаю, почему он не работает.Ajax/jquery login form fail

Это простая форма входа в систему 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

попробуйте подвигать возвращение ложного в другой блок функции успеха. Правильно ли ваш синтаксис document.location? – DG3

+0

Если это фрагменты из вашего фактического кода, то он подвержен атакам SQL Injection (ну, при определенных обстоятельствах: http://stackoverflow.com/questions/1220182/does-mysql-real-escape-string-fully-protect-against -sql-инъекция). – dezso

+0

Если ответ @SimpleCoder был верным, обязательно отметьте его как правильное, нажав галочку - дайте кредит, в котором благодарите людей :) – Mattygabe

ответ

3

Это всегда будет возвращаться false, поскольку $.ajax() (как и другие методы jQuery ajax) работает асинхронно по умолчанию , Вам нужно будет обработать все события в обратном вызове (например, ваш обратный вызов success).

Кроме того, я бы предложил не делать: if (result == '0'). Вместо этого используйте ===.

В идеале вы должны вместо этого возвращать JSON или, по крайней мере, то, что не соответствует действительности, false, 0, 1 и т. Д. Эти четыре значения (и другие) могут быть легко сбиты с толку, когда дело доходит до булевой обработки JavaScript.

+1

Если вам нужен обработчик клика для возврата 'false', то вы должны сделать это, как предлагал @SimpleCoder, установить опцию' async' AJAX на 'false', что делает синхронный вызов AJAX и будет ждать либо' success', либо 'error 'вызываются. Браузеры, не названные Firefox, будут «запираться», поэтому, если у вас есть какой-либо графический файл загрузки, он не работает так хорошо. Таким образом, если вам не нужен запрос «синхронный», просто дайте вашим успехам и обработчикам ошибок сделать свое дело, когда запрос вернется. – Mattygabe

0

Помимо того, что return утверждения выполняются, прежде чем либо из функций обратного вызова (success и error) называется, и это не кажется, что все это делается с возвращаемым значением функции обработчика нажмите для $("#submit_login"), что может произойти, хотя вы делаете вызов AJAX в событии click, браузер также отправляет сообщение формы, потому что #submit_login - это кнопка типа submit - независимо от того, выполняется ли вызов AJAX, страница перезагружается на form submit (так что выглядит так, как будто обработчик 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. Все, что необходимо сделать, можно поместить в обработчики success/error.

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; 
     } 
    } 
});