【问题标题】:PHP session_destroy() isn't workingPHP session_destroy() 不工作
【发布时间】:2016-10-20 12:31:13
【问题描述】:

这令人沮丧,我已经使用 PHP Sessions 很长时间了,直到现在还没有遇到过这个问题。我正在使用 PHP 编写一个基本的登录/注销脚本。

这是我的注销脚本。

logout.php

<?php
     session_start();
     unset($_SESSION['email']);
     session_destroy();
     header("Location:login.php"); 
?>

因此我的 login.php 脚本具有以下代码:

login.php

// I send the user to logged_in.php if the session already exists.
if(isset($_SESSION['email'])) header("Location:logged_in.php");

if(pass and username are correct){
    $_SESSION['email'] = $email;
    session_write_close();
    header('Refresh: 1; logged_in.php');
}

现在,当我登录并被重定向到 logged_in.php 页面时,当我转到 logout.php 页面时会在那里形成,而不是被重定向到 >login.php 它返回到 logged_in.php

这意味着当它到达 login.php 时会话仍然存在并且它在 login.php

中输入以下 if 语句
if(isset($_SESSION['email'])) header("Location:logged_in.php);

【问题讨论】:

  • 你必须在unset($_SESSION['email'];处错过括号
  • 哦,这只是粘贴代码时的拼写错误。文本编辑器中的语法都是正确的。
  • 你访问login.php时是否总是被重定向(独立有没有会话,尝试删除所有php-session文件并在浏览器地址栏直接访问login.php )? .. 这是一个奇怪的建议,可能是你在if-statement 之后有额外的分号,比如:if (isset($_SESSION['email'])); header('Location: logged_in.php');?根据您的消息来源,即使没有session_start(),您也已被重定向,但如果您尚未初始化它,则不能存在$_SESSION 全局变量。我猜在这种情况下您无法永久登录。

标签: php session


【解决方案1】:

试试这样的:

session_start();

// I send the user to logged_in.php if the session already exists.
if(isset($_SESSION['email'])) header("Location:logged_in.php");

if(pass and username are correct){
    $_SESSION['email'] = $email;
    session_write_close();
    header('Refresh: 1; logged_in.php');
}

【讨论】:

  • 你的代码和我在login.php下贴的代码有什么区别?
  • @TayabSoomro session_start() call.
  • 这是正确的答案,在您的 login.php 中,您没有使用session_start() 初始化会话。在您的 logout.php 中,您正在取消设置“email”seassion 变量。使用 destroy 你已经在这样做了。
  • 结果还是一样,即使加了session_start();
【解决方案2】:

session_regenerate_id(true) 为我工作。我以前也有同样的问题。似乎某些浏览器在它们处于活动状态时没有正确删除会话 cookie。重新生成 ID 会为您提供一个新的会话,尽管您当然应该像以前一样删除旧会话。我不太确定这是修复还是解决方法,但它确实有效。如果您将参数设置为 true,session_regenerate_id 将创建一个新的会话变量并删除旧的。

【讨论】:

  • 它在 logout.php 中的session_destory(); 下?
  • 正确。它在我的注销脚本中工作。但是根据文档,您不必在 5.1 版中使用 session_regenerate_id(true) 销毁会话 cookie。任何早期版本,您可以将其放在session_destroy() 下方并省略参数。
  • 虽然当我使用 Safari 时,它会将我重定向回 l​​ogin.php,但是当我在地址栏中手动输入 logged_in.php 时,它可以让我进入,但它不应该。
  • @TayabSoomro 在您的 logged_in.php 文件中您需要添加验证,if (isset($_SESSION['email']))
猜你喜欢
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2018-08-19
相关资源
最近更新 更多