2009-12-28 1 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 />'; 

Когда я запускаю этот код на некоторых веб-хостингах, его выход в порядке.

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 Globals и register_globals directive.

В принципе, это хороший урок, почему вы не должны использовать регистровые глобалы. В этом случае совпадение имен, вероятно, безвредно, но вы можете создать огромные проблемы таким образом, даже уязвимости для атак.

+0

+1: приятно поймать! Я не понимал, как может возникнуть описанная проблема, и не думал о register_global - после установки register_global = On, я воспроизвожу проблему ^^ ;; и если бы я мог, я бы дал вам еще один +1 для «вы не должны использовать регистровые глобалы» –

+0

+1 для просмотра того, что происходит. Ключ без кавычек был немного красно-селедочным. –

+0

+1 Я не знал о register_globals, спасибо, что объяснил это! – dusan

Смежные вопросы