这是PHP语言中的错误还是什么?

时间:2010-02-17 00:50:33

标签: php

我真的很想知道这段代码

<?    
  session_start()
 $_SESSION['me'] = 654;
    $me = $_GET['me'];

    echo  $_SESSION['me'];
?>

它将打印$ me值而不是$ _SESSION ['me']值。

这是一个错误,还是出于安全原因这样做?任何解释?

3 个答案:

答案 0 :(得分:5)

您是否有机会启用register_globals

编辑:这似乎与着名的session side-effect that existed until PHP 4.3有关。如果未初始化会话变量,则将使用可能存在的同名全局变量的值。

  

PHP版本4.2.3及更低版本具有未记录的功能/错误,允许您在全局范围内初始化会话变量,尽管register_globals已禁用。如果使用此功能,并且还启用了session.bug_compat_warn,PHP 4.3.0及更高版本将发出警告。禁用此指令可以禁用此功能/错误。

我仍然无法完全了解为什么会发生这种情况。 pygorex1在他的回答中所写的内容甚至更奇怪。

答案 1 :(得分:3)

您是否在任何地方致电session_start()

如果没有,那么php可能是第二次猜测你的意思,所以你可以检查错误日志,看看究竟发生了什么。

答案 2 :(得分:3)

我可以使用PHP v5.2.10和register_globals以及多次访问页面后重新创建此行为:

test.php的:

<?php
session_start();
$_SESSION['me'] = 654;
$me = $_GET['me'];
echo  $_SESSION['me'];

http://localhost/test.php?me=321

第一次加载页面时,输出为654。第二次运行页面时,输出变为321。为什么会这样?

第一次:

  • 第一次调用时,$_SESSION['me']变量不存在,因此未初始化为全局。
  • $_GET['me']确实存在并初始化为全局变量$me

第二次:

  • 在页面刷新时,$_SESSION['me']变量现已存在并初始化为全局变量$me
  • $me现在引用$_SESSION['me']
  • $me的任何分配都将覆盖会话变量,因此SESSION变量变为321,输出变为321

然而,OP在评论中表示他已将register_globals关闭......在这种情况下,我不知道该怎么做!