为什么“;获取“;覆盖“;SESSION”;


Why Does "GET" Override "SESSION"

在代码中:

<?php
    session_start();
    $_SESSION['id'] = 14;
    if(isset($_GET['id']))
    {
        $id = $_GET['id'];
    }
    else
    {
        $id = $_SESSION['id'];
    }
    echo $id;
    echo "<br>";
    echo $_SESSION['id'];
?>

为什么回显的第二个值总是等于GET变量(假设有一个集合)?这是配置错误还是我遗漏了什么?

我的魔法水晶球说你打开了register_globals设置。通过调用phpinfo() 进行检查

register_globals处于启用状态时,$foo$_SESSION['foo']是彼此的引用,但前提是$foo在全局范围内。这意味着为其中一个指定一个值,使另一个更新。把它们想象成完全相同的变量。

那个环境很古老。如果我没记错的话,$foo和$_SESSION['fo']之间的引用将只在以下之一之后建立:

  1. 在调用session_start()之后,如果会话中存在$_session['fo']
  2. 在将任何值分配给$_SESSION['fo']之后立即
  3. 调用session_register('o')后立即

您应该强烈考虑禁用register_globals。像这样的意外程序行为正是不鼓励该设置的原因,并最终从php中完全删除。