PHP - foreach影响会话值

时间:2009-12-28 17:22:08

标签: php session foreach

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 />';

当我在某些网络托管上运行此代码时,其输出正常。

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

我不知道变量$ test如何影响$ _SESSION [test]。

1 个答案:

答案 0 :(得分:13)

我敢打赌你正在使用注册全局变量,这意味着如果你有一个名为test的会话变量,当你执行$test时它将成为一个名为session_start()的全局变量。然后,您的循环会更改$test的值,这是对会话变量的全局引用。

请参阅Using Register Globalsregister_globals directive

基本上,这是一个很好的教训,为什么你不应该使用寄存器全局变量。在这种情况下,名称冲突可能是无害的,但你可能会以这种方式产生巨大的问题,甚至是攻击的漏洞。