2010-03-02 113 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(),看它是否有效。