2010-03-02 84 views
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']的检查是站点范围和需要不同的东西,当我打电话给其下的各种项目。其他人建立了这个网站,我试图调试为什么它突然没有为他们工作。

+0

仅供参考 - 我可以正确地看到此logout.php页面上的其他环境变量,如$ _SERVER []和其他。由于某种原因,我似乎无法访问$ _SESSION []变量。这真的很奇怪。 – 2010-03-02 02:12:31

+0

可以提供用于session_start()(以及周围)的代码,以及访问$ _SESSION ['user']以用于工作和非工作(logout.php)页面的代码吗? – 2010-03-02 02:13:17

回答

0

你是从您所设定的会议上开始与完全相同域访问logout.php(即example.com与www.example.com/logout.php)

至于刚才你重置特定的会话数据,最好打电话session_destroy(),然后取消设置您的Cookie来终止会话。

+0

该会话由网站的其他方面使用。 是的,我相信我仍然在同一个领域。我没有想过这件事,但我相信我们已经清楚了。用户配置文件区域可能是: https://www.domain.com/profile/ ...将注销发送到/logout.php作为... https://www.domain.com /logout.php 因此,他们与https整个时间保持在同一个域根。 – 2010-03-02 02:16:10

+0

@Will Ashworth:你可以在你的问题中发布你的logout.php代码吗? – jasonbar 2010-03-02 02:18:55

+0

在这个时候,我只有这个... <?php \t session_start(); \t print_r($ _ SESSION); \t print_r($ _ SERVER); \t exit(); ?> 主要是因为我在尝试调试。我看到服务器输出,但没有输出$ _SESSION信息。如果我使用相同的代码迁移到另一个页面,我会按预期查看会话的详细信息。 感谢您的帮助:) – 2010-03-02 02:29:21

3

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

要解决问题(如果是这种情况),您应该在session_start之前删除所有输出。即使在<?php之前的空间也会被Apache(和其他)输出。还要确保你已经禁用了文档中的BOM(字节顺序标记)(任何体面的编辑器都会让你改变这个,只是寻找“当前文件设置”之类的东西)。

2

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