奇怪的PHP会话行为。 PHP用$ var覆盖$ _SESSION ['var']

时间:2010-09-10 17:55:50

标签: php session

我有这个小PHP脚本:

<?php
session_start();

$var = array();
$var['key'] = 'Var -> Key';

if ($_GET['set']) {
  $_SESSION = array();
  $_SESSION['var'] = 'Session -> Var';
}
print_r($_SESSION);
?>

我希望它能返回这个,因为set = 0和set = 1:

Array
(
    [var] => Session -> Var
)

然而,它返回set = 0(当然set = 1之后):

Array
(
    [var] => Array
        (
            [key] => Var -> Key
        )

)

在这里看看你的身份: http://dev.gruppenunterkuenfte.de/index_test.php?set=1

接下来发生的是$ _SESSION ['var']被$ var取代。 但只有在下一页加载后才能使用。

知道为什么吗?

我可以在我的托管服务商管理界面中切换我的PHP版本,我尝试了5.2.11,5.3.2和4.4.8。

这是我可以在PHP中更改的设置,因此它不会覆盖会话变量吗? 因为我在另一台服务器上没有此问题。

如果定义了$ _SESSION ['var'],那么在$ _SESSION ['var']中,有些设置可以让PHP写$ var。

3 个答案:

答案 0 :(得分:3)

关闭register_globals选项

答案 1 :(得分:1)

没什么奇怪的,这是记录在案的行为 只需关闭register_globals

即可

答案 2 :(得分:1)

$_SESSION['var'] = 'x';

这将创建基础$ var ='x';

,由于在您的php.ini或php服务器设置中RegisterGlobals为ON,因此其他php页面和函数也可以看到$ var。

如果您设置$ var ='y';然后$ _SESSION ['var']立即变为'y'

PHP directive register_globals went from ON to OFF in PHP » 4.2.0. 
This feature has been DEPRECATED as of PHP 5.3.0 
and register_globals has been REMOVED as of PHP 5.4.0

解决方案: 将$ var和$ _SESSION ['var']的名称分开,例如:

$myvar = array();   //not $var  = array();
_SESSION['var'] = anyobject;

这样,无论php主机服务器设置了什么设置,您的代码都是兼容的。