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]。
答案 0 :(得分:13)
我敢打赌你正在使用注册全局变量,这意味着如果你有一个名为test
的会话变量,当你执行$test
时它将成为一个名为session_start()
的全局变量。然后,您的循环会更改$test
的值,这是对会话变量的全局引用。
请参阅Using Register Globals和register_globals directive。
基本上,这是一个很好的教训,为什么你不应该使用寄存器全局变量。在这种情况下,名称冲突可能是无害的,但你可能会以这种方式产生巨大的问题,甚至是攻击的漏洞。