首页 > 解决方案 > 登录页面上对 PHP 文件的 AJAX 请求

问题描述

我在 PHP 中偶然发现了 AJAX 请求的问题,并且我无法找到与我已经在我的代码中编写的内容接近的主题。

首先,我想使用对 PHP 文件的 AJAX 请求为我的 Web 应用程序创建一个登录页面。

在“login.php”中:

$(document).ready(function(){
        var $errorWrapper = $('#error-handler'); // Error div 
        var $errorCardText = $('#error-handler p'); // Error div text
        var $user = $('#user-input'); // Input field for username
        var $pwd = $('#pwd-input'); // Input field for password

        $('#login-btn').on('click', function(){

            var $data = {
            'username': $user.val(),
            'password': $pwd.val()
            };

            $dataStr = JSON.stringify($data);

            $.ajax({
                type: 'POST',
                url: 'php/loginValid.php',
                data: {json: $dataStr}, 
                dataType: 'JSON',
                contentType: 'application/json; charset=utf-8',
                success: function(data){
                    alert("Success");
                    if(data.status == 0){
                        $errorWrapper.css('display', 'block');
                        $errorCard.text("Username or password incorrect!");
                    }else if (data.status == 2){
                        $errorWrapper.css('display', 'block');
                        $errorCard.text("No matching account for username inserted.");
                    }
                }
            });
        });
    });

在“loginValid.php”(它是从 AJAX 捕获 POST 请求的文件):

<?php
include 'classes.php';

//Catch the AJAX POST request form server and decode it from JSON

    $request = json_decode($_POST['json'], true);
    $username = $request['username'];
    $password = $request['password'];

    $loginObj = new LoginValid($username, $password);
    $code = $loginObj -> checkValidation();

    $response = array('status' => $code);

    echo json_encode($response));?>

“classes.php”文件实现了检查凭证的功能:

class LoginValid{
    private $username;
    private $pwd;
    private $statusCode;

    function __construct($user, $pass){
        $this->$username = $user;
        $this->$pwd = hash('sha512', $pass);
    }

    public function checkValidation (){

        include '../conf/db.php';

        $conn = new mysqli($servernameDB, $userDB, $passwordDB, $dbName);

        $stmt = $conn -> prepare ("SELECT FROM users WHERE username = ?");

        $stmt -> bind_param('s', $this->$username);

        $stmt -> execute();
        $stmt -> store_result();
        $result = $stmt -> get_result();
        $row = $result -> fetch_assoc();

        // Check if the credentials match and return the status code for jQuery error handler

        if ($result -> num_rows == 0){
            $this->$statusCode = 2;
        }else{

            if ($row['username'] == $this -> $username && $row['password'] == $this->$pwd){
                $this -> $statusCode = 1;
                session_start();
                $_SESSION['username'] = $username;
                $_SESSION['password'] = $password;
                header("Location: ../index.php");
            }else{
                $this -> $statusCode = 0;
            }
        }

        return $this -> $statusCode;
    }
}

“db.php”只存储数据库凭据,以便在整个应用程序中更轻松地集成。

我不知道为什么它没有进入成功回调。我提到了一个事实,即我已经尝试在发出 AJAX 请求之前警告 JSON 字符串,并且它显示了正确的内容。

谢谢你。

标签: phpajax

解决方案


这是错误的:

contentType: 'application/json; charset=utf-8',

当您将对象用作 中的data:选项时$.ajax,它使用 URL 编码格式,而不是 JSON。参数的值是 JSON 的事实json并不相关,它仍然包含在 URL 编码的参数中。您应该忽略该选项。

如果你这样做会更简单:

data: $data,

然后在 PHP 脚本中可以使用$_POST['username']and $_POST['password'],不需要调用json_decode().


推荐阅读