2

コード内:

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

エコーアウトされる 2 番目の値が常に GET 変数と等しいのはなぜですか (1 つのセットがあると仮定して)? これは設定ミスですか、それとも何か不足していますか?

4

1 に答える 1

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 から完全に削除されたまさにその理由です。

于 2013-07-13T06:51:15.357 に答える