php - 无法让 ajax 发布工作

标签 php javascript jquery ajax

我能够触发 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;
}

最佳答案

好的,我会尝试一下,看看我们能否解决这个问题。首先,让我们稍微清理一下您的代码 - 干净的代码总是最容易调试的:

$(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 换成 console.log - 不那么烦人了。打开您的控制台进行检查 - command + optn + J 如果您使用的是 Chrome。

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

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

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

  • 最后我们返回 false,这样页面就不会刷新。


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

我无法修复您的 PHP,因为您没有发布它,但我假设您将继续进行编辑或自行解决。解决服务器问题后,您应该会返回一个干净的 console.log 以及您发回的响应,然后您就可以继续了。

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

希望这对您有所帮助!

关于php - 无法让 ajax 发布工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18348404/

相关文章:

php - 将全局变量包含到 php 样式表中。

javascript - 当用户滚动经过所有行时,表格后面的按钮出现

javascript - Jquery Modal 弹出窗口一遍又一遍地重新渲染

jquery - 获取 ddSlick 下拉列表中所选 <option> 的属性

javascript - 删除该行后如何在跨度单击上获取表 td 值

php - 需要调用 header 和 footer 还有一个 main div 来调用内容

php - 无法上传 csv 文件

javascript - jQuery Accordion 如何获取事件标题的选择按钮

php - 加载特定的 PHP 版本

javascript - 安装 ExtJS