无法获得ajax帖子上班

时间:2013-08-21 03:29:47

标签: php javascript jquery ajax

我能够触发js文件执行第一次警报,但我无法获得第二次警报,php文件就在那里并且工作返回0但警报('完成后');没有出现。我认为它缺少一些语法。

$(function () {
$("#login_form").submit(function () {
    alert('started js');
    //get the username and password  
    var username = $('#username').val();
    var password = $('#password').val();

    //use ajax to run the check  
    $.post("../php/checklogin.php", { username: username, password: password }, 
        function (result) {
            alert('finished post');
            //if the result is not 1  
            if (result == 0) {
                //Alert username and password are wrong 
                $('#login').html('Credentials wrong');
                alert('got 0');
            }
    });
});

});

这是php

session_start();
include 'anonconnect.php';

// username and password sent from form 
$myusername= $_POST['username']; 
$mypassword= $_POST['password']; 

$sql = $dbh->prepare("SELECT * FROM Users WHERE UserLogin= :login");
$sql->execute(array(':login' => $myusername));
$sql = $sql->fetch();

$admin = $sql['admin'];

$password_hash = $sql['UserPass'];
$salt = $sql['salt'];

/*** close the database connection ***/
$dbh = null;

if(crypt($mypassword, $salt) == $password_hash){
    // Register $myusername, $mypassword and redirect to file
    $_SESSION['myusername'] = $myusername;
    $_SESSION['loggedin'];
    $_SESSION['loggedin'] = 1;

    if($admin == 1){
        $_SESSION['admin'] = 1;
    }

    header("location:search.php");
}
else {
    $_SESSION['loggedin'];
    $_SESSION['loggedin'] = 0;
    echo 0;
}

4 个答案:

答案 0 :(得分:3)

好的,我会抓住这个,看看我们是否可以解决这个问题。首先,让我们稍微清理你的代码 - 干净的代码总是最容易调试:

$(function () {
  $("#login_form").on('submit', function(){
    console.log('form submitted');

    // get the username and password  
    var login_info = { username: $('#username').val(), password: $('#password').val() }

    // use ajax to run the check
    $.ajax({
      url: '../php/checklogin.php',
      type: 'POST',
      data: login_info,
      success: loginHandler
      error: function(xhr, status, err){ console.log(xhr, status, err); }
    });

   return false;

  });

  function loginHandler(loggedIn){
    if (!loggedIn) {
      console.log('login incorrect');
    } else {
      console.log('logged in');
    }
  }

});

...好的,我们现在看起来好一点了。让我们快速回顾一下这些变化。


  • 首先,为alert s交换了console.log - 更不用讨厌了。如果您使用的是Chrome,请打开控制台进行检查 - command + optn + J

  • 其次,我们稍微压缩了登录信息 - 这只是美学并使我们的代码更清洁一点。实际上你应该在需要再次使用时使用变量,在这种情况下你只需要使用一次。

  • 接下来,我们将$.post函数替换为$.ajax。这给了我们两件事 - 一个是对请求细节的更精细控制,第二个是错误回调,在这种情况下尤其重要,因为你几乎肯定会收到服务器错误,这是你原来的问题。 Here are the docs for $.ajax进一步澄清。

  • 我们还将成功处理程序指向一个函数,以最大限度地减少嵌套。您可以在下面看到声明的函数,它将接收服务器返回的数据。

  • 最后我们返回false,以便页面不刷新。


现在,让我们来解决这个问题。使用此代码时,您应该在控制台中看到一些内容。第一个可能是带有500 internal server error之类的红色消息,第二个应该是ajax函数的错误回调结果。如果您点击网络标签并查看请求和回复的详细信息,您可以在Chrome中获得更多有关此内容的详细信息。

我无法修复您的PHP,因为您没有发布它,但我会假设您要么自己跟进编辑或计算。一旦你解决了服务器问题,你应该回复一个干净的console.log并回复你的回复,然后你可以继续前进。

或者,这将起作用,因为缺少页面刷新,在这种情况下你可以忽略前两段并声明胜利:)

希望这有帮助!

答案 1 :(得分:1)

啊,太明显了。您没有取消默认提交操作,因此表单正常提交。添加此

$("#login_form").submit(function (e) {
    e.preventDefault();

    // and so on

请参阅http://api.jquery.com/event.preventDefault/

答案 2 :(得分:-1)

您需要更改第二行并添加e.preventDefault以防止表单刷新整个页面。

$("#login_form").submit(function (e) {
    e.preventDefault();

此外,我会更改AJAX请求以使用GET并更改PHP中的代码以从GET读取变量,这样您就可以通过在浏览器中运行它来轻松测试PHP页面是否正常工作 ?的 checklogin.php用户名= X&安培;密码= Y

答案 3 :(得分:-1)

试试这个:

$("#login_form").submit(function () {
    alert('started js');
    //get the username and password  
    var username = $('#username').val();
    var password = $('#password').val();

    //use ajax to run the check  
    $.post("../php/checklogin.php", { username: username, password: password }, function (result) {
        alert('finished post');
        //if the result is not 1  
        if (result == '0') {
        //Alert username and password are wrong 
            $('#login').html('Credentials wrong');
            alert('got 0');
        }
    }, 'text');
});
  1. },'text');
  2. 也许服务器没有提供正确的数据格式。例如,如果您请求json,并且jQuery无法将结果sting转换为json。然后该函数将不会被执行,然后你将无法获得'alert('得到0');'的事情。