【发布时间】:2018-03-08 06:56:11
【问题描述】:
我很难弄清楚为什么我的 PHP 会话变量不能与 JQuery 和 AJAX 一起使用。您可以在下面找到一些代码,在用户完成表单#enterUsername 后,他们成功地从email.php 获得结果。这是因为该代码是 POST 的原始接收者,因此它依赖于它,但之后的所有内容都无法获取依赖它的会话变量。
注意:这是很多代码我知道我要求很多。我建议如果您希望帮助您快速浏览它,然后开始检查我的会话变量。
代码:
着陆页
<html>
<head>
<?php
// Remove Any Previous Session
session_start();
session_destroy(); // I tried commenting this out
?>
// Irrelevant Lines Removed from Head
<script src="index.js"></script>
</head>
<body>
<div id="loginContainer">
<div id="loginBox">
<div id="login">
<div id="loading" class="hidden"></div>
<form action="email.php" method="post" id="enterUsername">
<h4>Username:</h4>
<input type="text" class="input" style="cursor: text;" name="username" maxlength="40" autocomplete="off">
<p><b>Example: XXXXXXXX</b></p>
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . '/core/recaptcha.php';
DisplayReCaptcha();
?>
<input type="submit" class="input" value="Continue">
</form>
</div>
</div>
</div>
<div class="status">
<?php
// For Error Handling
if(!empty($_SESSION["ReCaptcha_Reason"])) {
echo '<div class="error"><span class="closebtn" onclick="this.parentElement.style.display=\'none\';">×</span><h4>' . $_SESSION["ReCaptcha_Reason"] . '</h4></div>';
$_SESSION["ReCaptcha_Reason"] = "";
}
?>
</div>
</body>
</html>
index.js
$(document).ready(function() {
// Get Username Form...
var UsernameForm = $('#enterUsername');
// Catch Username Form...
$(UsernameForm).submit(function(event) {
// Catch Browser Submitting Form
event.preventDefault();
// Hide UsernameForm...
$("#enterUsername").hide();
// Error Message Response Removal
$(".success, .error, .warning, .info").remove();
// Start Loading
$("#loading").removeClass("hidden");
// Serialize the form data
var formData = $(UsernameForm).serialize();
// Submit the form using AJAX.
$.ajax({
type: $(UsernameForm).attr('method'),
url: $(UsernameForm).attr('action'),
data: formData
})
.done(function(response) {
window.setTimeout(function(){
// Done Loading
$("#loading").addClass("hidden");
if(response == "REFRESH") {
location.reload();
} else if(response.startsWith("Error")) {
// Error Message Adding
$(".status").append("<div class=\"error\"><span class=\"closebtn\" onclick=\"this.parentElement.style.display='none';\">" +
"×</span>" + response.replace("Error", "") + "</div>");
// Show Form Again
$("#enterUsername").show();
} else {
// Remove UsernameForm...
$("#enterUsername").hide();
// Set the message text.
$("#login").append(response);
}
}, 1000)
})
});
$(document).arrive("#enrollNow", function() {
// Get EnrollNowButton...
var EnrollNowButton = $('#enrollNow');
// Catch EnrollNowButton...
$(EnrollNowButton).click(function(event) {
// Hide EnrollNowButton Container...
$("#enrollNowContainer").hide();
// Error Message Response Removal
$(".success, .error, .warning, .info").remove();
// Start Loading
$("#loading").removeClass("hidden");
// Submit the form using AJAX.
$.ajax({
type: "POST",
url: "/core/enrollnow.php"
})
.done(function(response) {
window.setTimeout(function(){
// Done Loading
$("#loading").addClass("hidden");
if(response.startsWith("Error")) {
// Error Message Response Adding
$(".status").append("<div class=\"error\"><span class=\"closebtn\" onclick=\"this.parentElement.style.display='none';\">" +
"×</span>" + response.replace("Error", "") + "</div>");
// Show Form Again
$("#enrollNowContainer").show();
} else {
// Remove EnrollNowButton Container...
$("#enrollNowContainer").remove();
// Increase height
$("#loginContainer").height("70%");
// Set the message text.
$("#login").append(response);
}
}, 1000)
})
});
});
$(document).arrive("#enrollPhase1", function() {
// Get EnrollPhase1 Form...
var EnrollPhase1Form = $('#enrollPhase1');
// Serialize the form data
var formData = $(EnrollPhase1Form).serialize();
// Submit the form using AJAX.
$.ajax({
type: $(EnrollPhase1Form).attr('method'),
url: $(EnrollPhase1Form).attr('action'),
data: formData
})
.done(function(response) {
window.setTimeout(function(){
$("#loading").addClass("hidden");
if(response == "REFRESH") {
location.reload();
} else if(response.startsWith("Error")) {
// Error Message Adding
$(".status").append("<div class=\"error\"><span class=\"closebtn\" onclick=\"this.parentElement.style.display='none';\">" +
"×</span>" + response.replace("Error", "") + "</div>");
// Increase height
$("#loginContainer").height("70%");
// Show Form Again
$("#enrollPhase1Container").show();
} else {
// Remove UsernameForm...
$("#enrollPhase1Container").remove();
// Decrease height
$("#loginContainer").height("50%");
// Set the message text.
$("#login").append(response);
}
}, 1000)
})
});
});
});
电子邮件.php
<?php
// Check For Username Submission
if($_POST["username"] === "") {
die("Error<h4>No Username Entered</h4>");
}
if(!isset($_POST["username"])) {
die("Error<h4>Server is Missing Data</h4>");
}
// Check ReCaptcha and Add For Username Not Found
require_once $_SERVER['DOCUMENT_ROOT'] . '/core/recaptcha.php';
if(isset($_POST["g-recaptcha-response"])) {
$ReCaptcha = GetReCaptchaResults("6LfRakIUAAAAAGYkxaO1iswoxDt4QTcA82AyXhXL", $_POST["g-recaptcha-response"]);
$ReCaptcha = json_decode($ReCaptcha, true);
if($ReCaptcha["success"] !== true) {
// See Note At Top
TriggerReCaptcha("ReCaptcha Human Test Failed");
die("REFRESH");
}
}
// Start Session and Save UsernameForm
session_start();
$_SESSION["username"] = $_POST["username"];
// Get User
require_once $_SERVER['DOCUMENT_ROOT'] . '/core/user.php';
$User = GetUser($_POST["username"]);
// Does The User Exist
if($User === "Error - User Not Found") {
// See Note At Top
TriggerReCaptcha("User Not Found");
die("REFRESH");
}
// User Is Legit
TerminateReCaptcha();
// Check For Disabled Account
if($User["UserDisabled"] === "True") {
die('<div id="enrollNowContainer"><h4>' . $User["DisplayName"] . ',</h4><b><p>Your Account is Disabled</p></b><br><p>Your IT staff has disabled your account from being used.</p>');
}
// Check for Enrollment
if(empty($User["SecurityQuestion1"]) || empty($User["SecurityAnswer1"]) ||
empty($User["SecurityQuestion2"]) || empty($User["SecurityAnswer2"]) || empty($User["BackUpEmail"])) {
// Not Enrolled
die('<div id="enrollNowContainer"><h4>' . $User["DisplayName"] . ',</h4><p>Your Account is not Enrolled</p><br><br><button class="input" id="enrollNow">Enroll Now</button></div>');
} else {
echo '
<button class="input" id="resetPassword">Reset Password</button><br><br>
<button class="input" id="changeSettings">Change Setttings</button>';
}
?>
enrollnow.php
(需要会话的第一页...)
<?php
// Open Session
session_start();
// Check For Username Submission
if($_SESSION["username"] === "") {
die("Error<h4>No Username Entered</h4>");
}
if(!isset($_SESSION["username"])) {
die("Error<h4>Server is Missing Data</h4>");
}
// Get User
require_once $_SERVER['DOCUMENT_ROOT'] . '/core/user.php';
$User = GetUser($_SESSION["username"]);
if($User === "Error - User Not Found") {
die("Error<h4>User Not Found</h4>");
}
// Check for Enrollment
if(empty($User["SecurityQuestion1"]) || empty($User["SecurityAnswer1"]) ||
empty($User["SecurityQuestion2"]) || empty($User["SecurityAnswer2"]) || empty($User["BackUpEmail"])) {
// Not Enrolled
StartEnrollment();
}
function StartEnrollment() {
$FinalHTML = '<div id="enrollPhase1Container"><form action="/core/enrollphase1.php" method="post" id="enrollPhase1">';
require_once $_SERVER['DOCUMENT_ROOT'] . '/core/sq.php';
// Security Question 1
$FinalHTML .= '<select name="SecurityQuestion1" class="input">';
foreach (GetSecurityQuestions() as $ArrayID => $Question) {
$FinalHTML .= '<option value="' . $Question["ID"] . '">' . $Question["Question"] . '</option>';
}
$FinalHTML .= '</select><br><br>';
$FinalHTML .= '<input type="text" class="input" id="SecurityAnswer1"></input><br><br>';
// Security Question 2
$FinalHTML .= '<select name="SecurityQuestion2" class="input">';
foreach (GetSecurityQuestions() as $ArrayID => $Question) {
$FinalHTML .= '<option value="' . $Question["ID"] . '">' . $Question["Question"] . '</option>';
}
$FinalHTML .= '</select><br><br>';
$FinalHTML .= '<input type="text" class="input" id="SecurityAnswer2"></input><br><br>';
$FinalHTML .= '<input type="submit" class="input" value="Continue"></input></form></div>';
die($FinalHTML);
}
?>
【问题讨论】:
-
我确实删除了尽可能多的代码。如果你觉得这太过分了,如果你想忽略这一点,我理解。
-
您是否在浏览器的开发工具中进行过调试,特别是检查 ajax 调用期间是否正在发送和接收(创建)php session cookie?
-
另外,您的目标网页的
session_start();在输出链中有点低。它应该始终高于任何输出(如果您希望使用基于 cookie 的会话)。还可以将其放在文件的最顶部,这可以揭示可能的传染性问题:ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); -
您究竟在哪里得到哪个错误?在enrollnow.php 中出现“未输入用户名”或“服务器缺少数据”?
-
@masterfloda "服务器缺少数据",会话变量为空。