2014-04-06 124 views
2

今天我在測試某些事情時遇到了一些奇怪的會話行爲。首先,我負責爲WordPress網站創建註冊功能。過去我在WordPress中做了大量的工作,但是我從來沒有做過任何涉及任何服務器端腳本語言的工作。會話變量在PHP中消失

我測試了我的工作環境,其中涉及確保我能夠連接到MySQL,確保會話正常工作,基本上只是讓自己熟悉設置。

當測試會議,我做了以下內容:

<?php 
$timer = time(); 

$_SESSION[$timer] = $timer; 

print_r($_SESSION); 
?> 

我期待在頁面的第一負載看到這樣的事情:

Array 
(
    [1396745563] => 1396745563 
) 

...這正是發生了。在第二次刷新,我想看看:

Array 
(
    [1396745563] => 1396745563 
    [1396745570] => 1396745570 
) 

...但是,相反,我看到:

Array 
(
    [1396745570] => 1396745570 
) 

哇!時間戳1396745563的原始會話變量已不存在,並且在其中有一個新的變量。

我的直接反應是可能缺少session_start(),但事實並非如此。只是爲了進一步說服自己的東西很奇怪這個,我改變了我的代碼看起來像這樣:

<?php 
$timer = time(); 

$_SESSION['time_' . $timer] = $timer; 

print_r($_SESSION); 
?> 

我想也許具有對索引的時間戳的會話變量有某種特殊的行爲(其中可能是我知道的這個問題的答案)。

這一次,行爲完全如我所料。頁面的每次刷新都添加到陣列打印輸出中。頁面的刷新數後,它看起來是這樣的:

Array 
(
    [time_1396745663] => 1396745663 
    [time_1396745667] => 1396745667 
    [time_1396745671] => 1396745671 
    [time_1396745675] => 1396745675 
    [1396745570] => 1396745570 
) 

那古怪的變量是從我原來的嘗試結轉(我只是精確)會話數據。

有人可以解釋這種非常奇怪的行爲?我想不出有什麼明顯的事情可以做到這一點。

注:我懷疑這與WordPress有什麼關係;我只是把它包括在這個背後給出了一個動機。

+0

如果你已經加入'在session_start();'在上面,你會看到這個通知.. **'未知:跳過數字鍵**。在使用會話之前添加'session_start();'總是一個好習慣。 –

回答

2

$_SESSION的鍵符合與PHP中的有效變量名稱相同的規則。他們必須以字母或下劃線開頭,後面跟着任意數量的字母,數字或下劃線。因此,time()的輸出不能作爲關鍵字,除非其前綴至少包含一個字母或下劃線。

error_reporting(E_ALL);添加到您的代碼和PHP會拋出類似以下的通知:

Notice: Unknown: Skipping numeric key 1396747512 in Unknown on line 0

+0

also session_start();必須在開始時調用 – user4035

+0

@ user4035問題的作者聲明:「我的直接反應是可能缺少'session_start()',但情況並非如此。」 –

+0

感謝您的快速回答!這確實是我遇到的問題,但缺少可見的錯誤信息使我認爲它「正常」工作。 –