繁体   English   中英

如何使用Javascript Ajax销毁PHP会话

[英]How to destroy PHP Sessions Using Javascript Ajax

我在我的网站上做了一个简单的登录功能。 我正在做的是,成功登录后,我使用session_start()在php中进行会话,然后定义$_SESSION变量来存储用户数据。 并已发送$_SESSION数据以响应对登录的Ajax调用。 登录成功,但是当我尝试注销用户时,只要单击注销按钮,我就简单地发送ajax请求。 并且在那里session_unset()session_destroy()被调用。 我立即想销毁我在登录时创建的会话,但这给了我错误: Trying to destroy uninitialized session 我不知道可能是什么问题,我在这里关注了一些问题,但无法解决问题。

AJAX电话

 $(document).on("click", "#logout", function(e) { fetch("Models/auth.php", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ "model": "auth", "action": "logout", "data": null }) }).then(function(t) { t.text().then(function(res) { console.log(res); // if(r.success){ // location.href = "register.html"; // } }) }) }) 

的PHP

 class Globals { public function makeSession($email, $id, $auth_key, $online, $session) { if (!isset($_SESSION)) { session_start(); $_SESSION["user_email"] = $email; $_SESSION["user_id"] = $id; $_SESSION["user_key"] = $auth_key; $_SESSION["user_online"] = $online; $_SESSION["user_session"] = $session; } } public function destroySession() { session_unset(); session_destroy(); } } if (isset($data)) { $conn = new Database; $db_conn = $conn - > connect(); switch ($data - > model) { case "auth": { $auth = new Auth(json_decode($data - > data), $data - > action); switch ($data - > action) { case "register": { $auth - > registerUser($db_conn); break; } case "login": { $auth - > loginUser($db_conn); break; } case "logout": { $g = new Globals(); //Call to destroy The Sessions $g - > destroySession(); echo json_encode(array("success" => true, "action" => "logout")); break; } } break; } } } 

为了销毁会话的数据,您需要初始化/恢复会话,否则将无法获取会话。 因此您需要调用session_start()

因此,请尝试以下代码:

 public function destroySession() {
    session_start();
    session_unset();
    session_destroy();
  }

您可以尝试的简单解决方案

session_start();

我们必须将其添加到php文件的顶部,否则php抛出异常,例如“已发送标头”或“无法启动会话”等。

因此有2个选项。1.添加session_start(); 在课堂上像

  public
  function destroySession() {
    session_start();
    session_unset();
    session_destroy();
  }

或2.只需添加session_start(); 在切换之前 你的代码看起来像

if (isset($data)) {

  $conn = new Database;
  $db_conn = $conn - > connect();
  session_start();
  switch ($data - > model) {
    case "auth":
      {
        $auth = new Auth(json_decode($data - > data), $data - > action);
        switch ($data - > action) {
          case "register":
            {
              $auth - > registerUser($db_conn);
              break;
            }
          case "login":
            {
              $auth - > loginUser($db_conn);
              break;
            }
          case "logout":
            {
              $g = new Globals();
              //Call to destroy The Sessions
              $g - > destroySession();
              echo json_encode(array("success" => true, "action" => "logout"));
              break;
            }
        }
        break;
      }
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM