1

我有一个我正在维护的 PHP 网站,并且我已经确认这在某一时刻有效。

我们有一个使用登录系统的网站,该系统将登录用户的信息存储在一个$_SESSION['user']变量中。该站点用于在单击/logout.php时注销用户,这实际上删除了会话的该部分,然后header()重定向到主页。

截至最近,顶部的/logout.php文件在用于输出它以进行调试session_start()时以某种方式看不到会话信息。print_r()

如果我转到另一个页面,我可以很好地看到会话信息,但在注销页面上看不到......这正是我无法删除会话信息的原因,因为它无法访问。

在浏览器关闭之前,我认为$_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']是整个站点的,当需要不同的事情时,我会调用它下面的各种项目。其他人建立了这个网站,我正在尝试调试为什么它突然对他们不起作用。

4

3 回答 3

3

如果域/子域与页面的其余部分相同,我会说这听起来像是典型的会话与输出错误。确保您已启用所有错误并显示它们,因为您可能在调用之前已将输出打印到客户端session_start()。这将破坏功能并使会话不可用。

要解决问题(如果是这种情况),您应该删除之前的所有输出session_start。甚至之前的空格<?php也会被 Apache(和其他)视为输出。还要确保您在文档中禁用了 BOM(字节顺序标记)(任何体面的编辑器都可以让您更改此设置,只需查找“当前文件设置”之类的内容)。

于 2010-03-11T14:42:21.497 回答
2

永远记住你的 PHP 代码的第一行应该是session_start();,仅此而已。如果您要做的只是取消设置会话变量并销毁会话,请尝试require_once($_SERVER['DOCUMENT_ROOT'].'/includes/config.php');在 logout.php 文件的末尾删除并添加 session_start() 和 session_destroy() 并查看它是否有效。

于 2010-03-16T15:34:40.103 回答
0

您是否从设置会话开始的同一个域访问 logout.php (即 example.com 与 www.example.com/logout.php)

至于只是取消设置特定的会话数据,最好调用session_destroy()然后取消设置您的 cookie 以终止会话。

于 2010-03-02T02:13:44.923 回答