【问题标题】:JQuery AJAX PHP Session not workingJQuery AJAX PHP会话不起作用
【发布时间】: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\';">&times;</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';\">" +
                  "&times;</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';\">" +
                  "&times;</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';\">" +
                  "&times;</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 "服务器缺少数据",会话变量为空。

标签: php jquery ajax session


【解决方案1】:

解决方案:


在 recaptcha.php 中,我有一个名为 TerminateReCaptcha() 的函数,它破坏了会话,而不是删除了 recaptcha 所需的页面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2023-03-25
    • 2011-08-03
    相关资源
    最近更新 更多