PHP变量名与会话变量冲突

时间:2011-06-26 02:55:06

标签: php session variables 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;
}

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

现在我注意到这个错误似乎源于$ freight = calc()。在该行之后,$ Freight将等于$ 10($ arr ['price']值)。 $ _SESSION ['运费']也将等于10美元,只需10美元,就好像它是与$ Freight相同的变量。我设置$运费,$ _SESSION ['运费']也变成了。

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

整体问题是: 无论如何改变$ a改变$ _SESSION ['a']?因为它看起来确实如此。

4 个答案:

答案 0 :(得分:7)

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

e.g。 $ _SESSION ['item']与$ item

相同

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

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

答案 1 :(得分:0)

据我所知......

您的$_SESSION变量根本不应该是会话变量,因为它总是等于$_SESSION['freight'] = $loc."#".$arr['price'];

答案 2 :(得分:0)

我实际上不理解会话的使用,所以这就是我接近它的方式

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

    $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 () 
{
    $a = split("#", $_GET['loc']); 
    $freight = calc($a[0]);
    echo number_format($freight, 2);
    return;
}

您只需要该位置即可运行查询。因此,只需使用数据库中的新数据设置会话一次。 希望有所帮助

答案 3 :(得分:0)

我总是对会话变量使用不同的表示法。例如$_SESSION['_uid']与常规$uid变量。