我有一个PHP网站,我正在维护,我已经确认这一点有效。
我们有一个使用登录系统的网站,该系统将登录用户的信息存储在$_SESSION['user']
变量中。用于在单击 /logout.php 时注销用户的网站基本上删除了该部分会话,然后header()
重定向到主页。
截至最近,当session_start()
用于输出调试时,顶部有print_r()
的 /logout.php 文件以某种方式看不到会话信息目的。
如果我转到另一个页面,我会看到会话信息很好,但不会在注销页面上...这正是我无法删除会话信息的原因,因为它无法访问。
我认为$_SESSION
在网站上是全局的,直到浏览器关闭。我从来没有遇到这种情况,我知道会话实例是在这个页面上启动的,所以它没有向我显示会话数据,这很奇怪。
有什么想法吗?我完全被这个难倒了!
代码:/logout.php
<?
#session_start() is inside this file
require_once($_SERVER['DOCUMENT_ROOT'].'/includes/config.php');
unset($_SESSION['user']);
header("location: /");
exit();
?>
$_SESSION['user']
的检查是在整个网站范围内的,当需要不同的东西时,我会调用它下面的各种项目。其他人建立了这个网站,我正在尝试调试它为什么不能突然为它们工作。
答案 0 :(得分:3)
如果域/子域与页面的其余部分相同,我会说这听起来像典型的会话与输出错误。确保已启用所有错误并显示它们,因为您可能在调用session_start()
之前将输出打印到客户端。这将破坏功能并使会话不可用。
要解决问题(如果是这种情况),您应该删除session_start
之前的所有输出。甚至<?php
之前的空格也将被Apache(和其他)视为输出。还要确保你已经在文档中禁用了BOM(字节顺序标记)(任何体面的编辑器都可以让你改变它,只需查找类似“当前文件设置”的内容)。
答案 1 :(得分:2)
永远记住你的PHP代码的第一行应该是session_start();
而不是别的。如果您要做的就是取消设置会话变量并销毁会话,请尝试删除require_once($_SERVER['DOCUMENT_ROOT'].'/includes/config.php');
并在logout.php文件的末尾添加session_start()和session_destroy(),看看它是否有效。
答案 2 :(得分:0)
您是否从设置会话开始时的相同的域访问logout.php(例如example.com与www.example.com/logout.php)
至于取消设置特定会话数据,最好拨打session_destroy()
,然后取消设置Cookie以终止会话。