【问题标题】:How to destroy PHP Sessions Using Javascript Ajax如何使用 Javascript Ajax 销毁 PHP 会话
【发布时间】:2019-04-19 18:52:53
【问题描述】:

我正在我的网站上创建一个简单的登录功能。我正在做的是,当登录成功时,我使用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;
      }
  }

}

【问题讨论】:

    标签: php session


    【解决方案1】:

    为了销毁会话的数据,您需要初始化/恢复会话,否则您将无法获取会话。所以你需要打电话给session_start()

    所以试试这个代码:

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

    【讨论】:

      【解决方案2】:

      一个简单的解决方案,你可以试试

      session_start();
      

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

      所以有 2 个选项 1.添加session_start();在类公共函数中,如

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

      或 2. 只需在 Switch case 之前添加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;
            }
        }
      

      【讨论】:

        猜你喜欢
        • 2012-05-25
        • 2011-11-06
        • 1970-01-01
        • 1970-01-01
        • 2011-03-07
        • 2019-01-19
        • 2011-02-01
        • 1970-01-01
        • 2012-09-23
        相关资源
        最近更新 更多