PHP变量名与会话变量冲突

Chr*_*ris 2 php variables session namespaces

我有其他人编写的以下代码段,我正在尝试修复:

function calc() {
    require_once("db.php");     
    connect();

    $a = split("#", $_SESSION['freight']);
    $loc = $a[0];

    $r = mysql_query("SELECT `price`, `gst` FROM `freight` WHERE `location`='$loc'");
    $arr = mysql_fetch_array($r);
    $_SESSION['freight'] = $loc."#".$arr['price'];      

    return $arr['price'];
}

function ajaxFunction () {
    $_SESSION['freight'] = $_GET['loc']; 
    $freight = calc();
    echo number_format($freight, 2);
    return;
}
Run Code Online (Sandbox Code Playgroud)

它不漂亮,我只是想解决它.

现在我注意到这个bug似乎源于$ freight = calc().在该行之后,$ Freight将等于$ 10($ arr ['price']值). $ _SESSION ['运费']也将等于10美元,而且只需10美元,就好像它与$运费一样.我设置$运费,$ _SESSION ['运费']也变成了.

如果我将ajax函数中的$ freight更改为$ freight2,则不会更改会话变量.这是我不了解PHP的主要内容吗?变量名与会话变量共享相同的名称空间?

总的问题是:无论如何改变$ a alter $ _SESSION ['a']?因为它看起来确实如此.

Dun*_*dnd 7

看起来您的注册全局变量在php.ini文件中设置为on.你需要关闭它.如果它打开,您的$ _SESSION,$ _GET,$ _POST元素可以称为变量名称.

例如$ _SESSION ['item']与$ item相同

更多信息:http://us2.php.net/manual/en/ini.core.php#ini.register-globals

此外,现在不推荐使用注册全局变量,这也意味着如果这确实是问题,那么您使用的是旧版本的PHP,并且可能需要考虑升级.