php - 登录页面上对 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 字符串,并且它显示了正确的内容。
谢谢你。
解决方案
这是错误的:
contentType: 'application/json; charset=utf-8',
当您将对象用作 中的data:
选项时$.ajax
,它使用 URL 编码格式,而不是 JSON。参数的值是 JSON 的事实json
并不相关,它仍然包含在 URL 编码的参数中。您应该忽略该选项。
如果你这样做会更简单:
data: $data,
然后在 PHP 脚本中可以使用$_POST['username']
and $_POST['password']
,不需要调用json_decode()
.
推荐阅读
- react-native - 反应原生我们如何在堆栈标题中使用抽屉导航
- python - 如何在 PySpark 上将所有功能组合成一列?
- xslt - 根据后代的几个条件选择节点
- python-2.7 - 通过我在 Flask 中的验证路线从浏览器下载历史通行证打开链接
- python - Python Sphinx 警告:定义列表结束时没有空行;意外的缩进
- knockout.js - Knockout.js - 封装视图模型并从外部隐藏它们
- linux - 如何禁用以破折号“-”开头的服务名称
- android - android 模块化 - 通过 Intent 启动时从另一个模块获取回调
- perl - Perl SOAP::LITE — 如何添加 http 请求头
- flutter - 这句话是什么意思:“尝试使用 Stream 替换 ChangeNotifier 超出了该类的范围。”