1

我能够触发 js 文件,它确实会发出第一个警报,但我无法让第二个警报发生,php 文件在那里并且工作返回 0 但警报('finished post'); 没有出现。我认为我缺少一些语法。

$(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

4 回答 4

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

});

...好的,我们现在看起来好多了。让我们快速回顾一下所做的更改。


  • 首先,将 s 换成alerts console.log- 不那么烦人了。打开你的控制台检查一下——command + optn + J如果你使用的是 Chrome。

  • 其次,我们稍微压缩了登录信息——这只是为了美观,让我们的代码更简洁。实际上,当需要再次使用变量时,您应该使用它们,在这种情况下,您只使用它们一次。

  • 接下来,我们将$.post函数换成$.ajax. 这给了我们两件事——一是对请求细节的更好控制,二是错误回调,在这种情况下尤其重要,因为您几乎肯定会遇到服务器错误,这是您最初的问题。这是用于进一步说明的文档。$.ajax

  • 我们还将成功处理程序指向一个函数以最小化此处的嵌套。你可以看到下面声明的函数,它将接收服务器返回的数据。

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


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

我无法修复你的 PHP,因为你没有发布它,但我假设你要么跟进编辑,要么自己解决。一旦你解决了服务器问题,你应该console.log用你发回的响应来恢复干净,你可以继续前进。

或者,由于缺少页面刷新,这将起作用,在这种情况下,您可以忽略前 2 段并宣布胜利:)

希望这可以帮助!

于 2013-08-21T03:45:32.743 回答
1

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

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

    // and so on

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

于 2013-08-21T03:44:05.177 回答
-1

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

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

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

于 2013-08-21T03:44:47.867 回答
-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. }, '文本');

也许服务器没有提供正确的数据格式。例如,如果您请求 json,而 jQuery 无法将结果字符串转换为 json。那么该函数将不会被执行,然后你将无法获得'alert('got 0');' 事物。

于 2013-08-21T03:45:43.400 回答