2013-07-13 87 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