2009-12-28 61 views
2

foreach循環如何影響會話變量?PHP - foreach影響會話值

session_start(); 
$_SESSION[test] = "Session content"; 
echo $_SESSION[test].'<br />'; 

$test_array = array("test", "array", "something", "array end"); 

foreach($test_array as $test){ 
    echo $test.'<br />'; 
} 

echo '<br />Session content after foreach: '.$_SESSION[test].'<br />'; 

當我在一些虛擬主機上運行這個代碼時,它的輸出是OK的。

Session content 
test 
array 
something 
array end 

Session content after foreach: Session content 

但只有在第一次執行(創建會話時)。當我執行此代碼第二次(已創建會話)的輸出如下:

Session content 
test 
array 
something 
array end 

Session content after foreach: array end 

我不知道怎麼才能變量$測試影響$ _SESSION [測試]。

回答

13

我敢打賭你正在使用註冊全局變量,這意味着,如果有一個名爲test一個會話變量,它會成爲一個全局變量命名$test當你執行session_start()。您的循環然後更改$test的值,該值是會話變量的全局引用。

請參閱Using Register Globalsregister_globals directive

基本上這是一個很好的教訓,爲什麼你不應該使用註冊全局變量。在這種情況下,名稱衝突可能是無害的,但是您可能會以這種方式創建巨大問題,甚至是攻擊的脆弱點。

+0

+1:很好!我不理解如何描述問題可能發生,並沒有考慮register_global - 在設置register_global = On之後,我再現了問題^^ ;;如果可以的話,我會給你另一個+1「你不應該使用註冊全局變量」 –

+0

+1來查看正在發生的事情。不加引號的數組鍵是一個紅鯡魚。 –

+0

+1我不知道register_globals,謝謝解釋! – dusan