【问题标题】:Return http response code from PHP to AJAX从 PHP 向 AJAX 返回 http 响应代码
【发布时间】:2018-09-11 06:28:52
【问题描述】:

我正在尝试为网站制作登录页面。我有一个使用 AJAX 向 PHP 脚本发送请求以检查是否输入了正确的用户名和密码的函数。如果查询返回成功结果,我发送 http_response_code(200),否则我发送 http_response_code(403) .但是,登录功能似乎没有返回任何响应状态。响应似乎未定义。在这种情况下,即使输入了正确的密码和用户名,该功能也会为我提供错误密码或用户名的窗口警报。我应该检查什么条件才能根据 http 响应代码确定成功函数应该做什么?是否有另一种方法可以根据 PHP 脚本的作用向 AJAX 返回条件?

这里是登录功能的代码。

function login(){
var username = document.getElementById("username").value;
var password = document.getElementById("password").value;
var dataString = 'username1=' + username + '&password1=' + password;
if (username == '' || login == ''){
    window.alert("Please fill in username or password.");
}
else{
    $.ajax({
        type: "POST",
        url: "login.php",
        data: dataString,
        cache: false,
        crossDomain : true,
        success: function(response) {
            if (response.status == 200) {
                window.location = 'http://localhost/site.html';
            }
            else {
                window.alert("The password or username you have entered is not valid");
            }
        }
    });
}        
return false;

}

这是我的 php 脚本。

<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
$password2 = $_POST['password1'];
$username2 = $_POST['username1'];
$connection = mysqli_connect("localhost", "root", "password", "database") or die("Unable to connect to MySQL");  
$query = mysqli_query($connection, "SELECT * FROM users where username = '$username2' AND password = '$password2'") or die(mysqli_error($connection));
$row = mysqli_fetch_array($query, MYSQLI_BOTH) or die(mysqli_error($connection));
if(!empty($row['username']) AND !empty($row['password'])) {
    session_start();
    $_SESSION['username'] = $username2;
    http_response_code(200);
    echo "Successful Login";
    exit;
}
else{
    http_response_code(403);
    echo "The password or username you have entered is not valid";
}
mysqli_close($connection);
?>

【问题讨论】:

  • 你的意思是“返回”,对吧?
  • 请使用 PDO 或其他为您准备好的语句。您的代码易受 SQL 注入攻击。
  • response 不是对象/数组...这不是您检查response.status 的方式
  • 更改 var dataString = 'username1=' + 用户名 + '&password1=' + 密码;到 var dataString = {username1 : username,password1:password};
  • 我认为 403 响应永远不会触发 ajax 的成功函数,您最好添加一个失败处理程序,或者查看 statusCode 属性为各种响应代码构建自定义处理程序。跨度>

标签: javascript php ajax


【解决方案1】:

当您检查响应并发送 get response.status 时,您实际上并没有数组或对象作为响应:

因此,在检查登录时,您可以使用 statusmessagejson_encode() 创建一个数组,以便您的 javascript 代码可以读取并读取它。

<?php
// fix your query connection - you are currently vulnerable. It does go outside of the scope of your question so I am not going to tackle it here.
if(!empty($row['username']) AND !empty($row['password'])) {
    session_start();
    $_SESSION['username'] = $username2;
    $return = array(
        'status' => 200,
        'message' => "Login Successful."
    );
    http_response_code(200);
}
else{
    $return = array(
        'status' => 403,
        'message' => "Login attempt denied."
    );
    http_response_code(403);
}
print_r(json_encode($return));

现在您可以在 AJAX 函数中获取响应:

    success: function(response) {
        var data = $.parseJSON(response);
        if (data.status == 200) {
            window.location = 'http://localhost/site.html';
        }
        else {
            window.alert(data.message);
        }
    }

【讨论】:

    【解决方案2】:

    您在成功函数中使用的response 参数是从 AJAX 调用返回的数据,而不是状态和/或标头。您可以通过获取函数的第二个参数来获取描述状态的字符串:

    $.ajax({
      ...
      success: function(data, status){
        if(status == "success"){
          // success code.
        }
      }
    });
    

    查看jQuery.ajax docs了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 2015-04-03
      • 2017-02-23
      • 2011-11-14
      • 2018-02-13
      • 2017-08-17
      • 2014-11-13
      相关资源
      最近更新 更多