为什么"GET"覆盖"SESSION"

Ani*_*m8r 2 php get

在代码中:

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

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

goa*_*oat 6

我的魔法水晶球说你打开了register_globals设置.通过电话检查phpinfo()

何时register_globals打开,$foo并且$_SESSION['foo']是彼此的引用,但仅当$ foo在全局范围内时.这意味着为其中任何一个分配值,导致另一个更新.将它们视为完全相同的变量.

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

  1. 在调用session_start()之后立即在会话中存在IF $ _SESSION ['foo'].
  2. 在为$ _SESSION ['foo']分配任何值后立即
  3. 调用session_register('foo')后立即

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