Как уничтожить сессии PHP с использованием Javascript Ajax - PullRequest
0 голосов
/ 19 апреля 2019

Я делаю простой вход в систему на моем сайте.Что я делаю, так это то, что при успешном входе в систему я делаю сеанс в php, используя session_start(), а затем определяю $_SESSION переменные, в которых я храню пользовательские данные.И эти $_SESSION данные были отправлены в ответ на вызов ajax для входа в систему.Вход выполнен успешно, но когда я пытаюсь выйти из системы, я просто отправляю ajax-запрос, когда нажимается кнопка выхода из системы.И там были названы session_unset() и session_destroy().Мгновенно я хочу уничтожить сеанс, который я сделал при входе в систему, но выдает ошибку: Trying to destroy uninitialized session;Я не знаю, в чем может быть проблема, я следил за некоторым вопросом здесь, но не смог решить проблему.

AJAX Call

$(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;
      }
  }

}

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Простое решение, которое вы можете попробовать

session_start();

Мы должны добавить это в начало php-файла, иначе php throw исключения, такие как «заголовки уже отправлены» или «не удается начать сеанс» и т. д.

Так что есть 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;
      }
  }
1 голос
/ 19 апреля 2019

Чтобы уничтожить данные для сеанса, вам нужно инициализировать / возобновить сеанс, иначе вы не сможете получить сеанс.поэтому вам нужно будет позвонить session_start().

, поэтому попробуйте этот код:

 public function destroySession() {
    session_start();
    session_unset();
    session_destroy();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...