2011-03-18 91 views
0

我正在寫一個PHP網站。我有一個$_SESSION['id'],它包含用戶的用戶名,我將在後面的腳本中使用這個值。不過,我注意到ID在我瀏覽網站時發生了變化。會話ID值更改

id以任何方式保留?或者,我應該將id更改爲其他內容嗎?

只要我多次點擊一個按鈕,就會發生這個問題。我100%確定在初始登錄後我沒有改變$_SESSION['id']

有人能幫我理解發生了什麼,以及如何解決問題。

+0

它改變了什麼?沒有?或者實際價值改變了嗎? – ircmaxell 2011-03-18 22:39:51

回答

2

我會假設你已經使用session_start,如果看不到其他意見:P

如果您對註冊全局變量,你可能會如果在代碼中使用變量$id,則會看到類似的行爲。作爲測試,請嘗試:

<?php 
session_start(); 
$_SESSION['testing'] = 'Foo'; 
$testing = 'bar'; 
die($_SESSION['testing']); 
?> 

重新加載頁面幾次。如果bar打印出來而不是Foo,那可能是您的問題。您可能想要使會話變量名稱不太可能在其他地方使用,或者(更正確)關閉註冊全局變量。

+0

令人驚歎!當我運行我的腳本我得到了Foo,在下次刷新時我得到了所有的時間吧..請你解釋一下這個奇怪的行爲,以及我如何在代碼中解決這個問題 – TDSii 2011-03-18 22:48:17

+0

腳本啓動時,'$ _SESSION ['id'] '被填充,但'$ id'也是一樣的。當你改變'$ id'時,它改變'$ _SESSION ['id']',但是直到下一頁加載。所以通常情況下,您不希望在變量中使用'$ _SESSION'中的同一個鍵。請記住,只有在註冊全局變量時纔會發生這種情況,並且有風險。 (ini_get('register_globals')== 1) \t die(「你必須禁用php腳本中的register_globals才能使這個腳本正常工作。」)( – steveo225 2011-03-18 22:51:57

+0

)只需將此文件添加到每個文件頂部包含的配置文件 。 ; – TDSii 2011-03-18 23:03:57

0

確保您在頁面的最頂端(即其他任何地方)撥打session_start()

這可能會導致擰緊。

一個非常簡要總結,爲什麼你需要這樣做:

大多數的會話ID(從$ _SESSION不同[「身份證」],不用擔心)通過cookie的存儲時間。 cookie值是通過響應頭髮送的,這些頭文件需要首先發送回客戶端。所以如果你在調用session_start()之前輸出ANYTHING,你實際上是在強制PHP發送響應頭文件。這將導致響應標頭不包含cookie會話值,因此無法正確使用會話。