2013-07-13 55 views
2

在代码:为什么“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']; 
?> 

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

+1

我假设他们不是巧合的14?这是你正在运行的实际代码吗? –

+0

那么你是说'echo $ _SESSION ['id'];'和echo $ id是一样的,即使'$ _GET ['id']!= 14'? – Sean

回答

6

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

检查它当register_globals是,$foo$_SESSION['foo']references对方,但只有$ foo是在全球范围内。这意味着分配一个值给他们中的任何一个,导致另一个更新。把它们想象成完全相同的变量。

该设置是古老的。如果我没有记错,$ foo和间引用$ _SESSION [“富”]只会之一后成立:

  1. 调用在session_start()如果$ _SESSION [“富”]在会话中存在后立即。
  2. 立即
  3. 调用了session_register( '富')后,立即给予任何价值$ _SESSION [ '富']后

你应当认真考虑禁用了register_globals。这种意外的程序行为就是这种设置令人沮丧的原因,并最终完全从php中删除。

+0

谢谢!这解释了我非常奇怪的问题:) – Anim8r