尽管调用了 session_destroy(),但会话并未被破坏

Session is not destroying though called session_destroy()

我正在开发带有会话的系统,我在其中放置了代码以在成功登录后启动会话并将值分配给会话变量,如 $_SESSION['email']。另外,我已经放了一个会话销毁代码,但会话似乎并没有销毁。我有以下文件 - index.php 此文件使用以下代码授予用户正确凭据的访问权限:

if(password_verify($password,$dbpass)){
    $stmt = $conn->prepare("SELECT name, image FROM admins WHERE email=?");
    $stmt->bind_param("s",$email);
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($name,$image);
    $stmt->fetch();
    $_SESSION['name'] = $name;
    $_SESSION['email'] = $email;
    $_SESSION['image'] = $image;
    header("Location:insert.php");
}

通过设置会话变量并重定向到预期文件,它工作正常。在文件 insert.php 中,我导入了包含以下代码的文件 session.php

session_start();
if(!isset($_SESSION['email'])){
    header("Location:index.php");
}

另外,我有一个 logout.php 文件,其中包含以下代码:

if(isset($_SESSION['email'])){
    session_destroy();
}
header("Location: index.php");

在 运行 logout.php 之后,如果我再次尝试访问文件 insert.php,它会打开,尽管其中导入了会话文件。它应该被重定向到 index.php 文件。出了什么问题?任何人都请帮助。

您的会话和 $_SESSION 服务器变量是分开的。 会话将中断,但变量不会为空。

试试这个:

session_start();
session_destroy();

//Now you can choose whether you want to unset all sessions, or specific one(s):
$unset_sessions = ['email'];

foreach($_SESSION as $session => $session_value) {
   if (in_array($session, $unset_sessions))
      unset($_SESSION[$session]);
}

//Or all of them:
$_SESSION = [];

认为用它创建一个函数会很有趣:

function breakSessions($specifics= []) {

   if (!empty($specific)) { //Handle specifics
      foreach($_SESSION as $session => $session_value) {
         if (in_array($session, $specifics))
            unset($_SESSION[$session]);
      }
   } else {
      $_SESSION = [];
   }

}

breakSessions(['login', 'remember_me']) //Specifics;
breakSessions(); //All of them```
if(isset($_SESSION['email'])){
    session_start();
    session_destroy();
}
header("Location: index.php");

你不能在没有 "start" 的情况下销毁会话。建议有一个包含 "session_start();" 的会话文件,您可以从中构建模板,以便每个页面始终具有 "session_start();"