2010-09-23 60 views
1

我遇到了一個非常奇怪的問題,在會話變量和局部變量。PHP會話變量與局部變量交換?

我想弄清楚如果我不理解有關會話在PHP中的某些事情,或者如果這是我的主機正在使用的PHP版本的問題。

這是一個非常簡單的代碼來演示奇怪的問題:

session_start(); 
var_dump($kenny); 
var_dump($_SESSION['kenny']); 
$_SESSION['kenny']='def'; 
var_dump($kenny); 
var_dump($_SESSION['kenny']); 
$kenny = 'abc'; 
var_dump($kenny); 
var_dump($_SESSION['kenny']); 

我第一次運行的代碼,我得到下面的結果(正如人們所期望的那樣):

NULL NULL NULL string(3) "def" string(3) "abc" string(3) "def" 

我再次運行它(當然,沒有關閉瀏覽器),我現在就明白了!

string(3) "def" string(3) "def" string(3) "def" string(3) "def" string(3) "abc" string(3) "abc" 

我運行它第3,第4,第5次,等等,我得到這個!

string(3) "abc" string(3) "abc" string(3) "def" string(3) "def" string(3) "abc" string(3) "abc" 

它看起來對我來說,會話​​變量「肯尼」和本地變量$肯尼成爲別名之一,並運行該腳本不止一次後對方。嗯......我真的不認爲這是如何在PHP中使用會話變量和局部變量。如果我在這裏丟失了某些東西,請糾正我。

我的網絡主機運行的是php 5.2.2。當我嘗試在其他主機此完全相同的代碼運行PHP 5.2.1,5.2.14和5.3.1,他們總是給我什麼,我想到:

第1次

NULL NULL NULL string(3) "def" string(3) "abc" string(3) "def" 

其後

NULL string(3) "def" NULL string(3) "def" string(3) "abc" string(3) "def" 

我檢查php.net更改日誌,並沒有發現任何東西,我能理解,可以解決這一問題。但就像我剛纔提到的那樣,早期版本(5.2.1)可以正常工作,所以這讓我非常困惑。

如果有人運行任何其他版本的PHP 5.2.x,請嘗試一下,讓我知道你是否看到相同的問題。或者如果有人對這個問題有所瞭解,我會非常感謝任何反饋。

非常感謝!

+3

是否啓用了註冊全局變量? – erisco 2010-09-23 15:41:28

回答

1

這可能是因爲register_globals指令處於打開狀態。這並不是說這是頁面上的$_SESSION變量都包括在內,但它說here

如果register_globals被啓用, 全局變量和 $_SESSION條目自動將 參考這是相同的值 在之前的會話 實例中註冊。但是,如果變量是 註冊的$_SESSION那麼 全局變量是可用的,因爲 下一個請求。

+0

非常感謝!該頁面爲我解釋了一切!我總是把register_globals關閉,並假定在將它上傳到服務器後它會關閉(我的錯誤假設)。這正是問題所在。我希望別人能夠通過這個答案得到幫助! – JoJoeDad 2010-09-23 16:44:53