php会话变量丢失了

时间:2011-10-12 05:52:27

标签: php session-variables

我在开发机器上使用php5和apache2。生产服务器显然是相似的。

我有一个脚本set_language.php,它根据所选语言创建一个会话变量:

<?php
session_start();
$back = $_SERVER['HTTP_REFERER'];

    if (isset($_GET['lang'])) {
            if ($_GET['lang'] == 'fr')
            $_SESSION['lang'] = 'fr';
        else if ($_GET['lang'] == 'en')
            $_SESSION['lang'] = 'en';
    }
    header( "Location: $back" ) ;
    exit();
?>

然后我将以下代码包含在所有页面中:

session_start();
if(isset($_SESSION['lang']) && $_SESSION['lang'] == 'en') {
    require('lang_en.php');
}
else if(isset($_SESSION['lang']) && $_SESSION['lang'] == 'fr') {
require('lang_fr.php');
}

我可以通过以下方式获得与语言相关的变量:

echo $lang[sometexttotranslate];

在开发服务器上,它按预期工作。我点击链接设置语言,我的会话变量包含lang = en或fr

在生产服务器上:

$ _ SESSION ['lang'] = dn dr (应该是en或fr)

echo $ lang [sometexttotranslate] = d (应该是翻译文本)

知道“d”来自何处?

这不是重定向/标头/ session_start()问题。


第一次加载时

print_r($ _ SESSION):

数组([lang] =&gt; fr)

单击英文链接(上面的set_lang.php)后

print_r($ _ SESSION):

数组([lang] =&gt; dn)

单击法语链接(上面的set_lang.php)后

print_r($ _ SESSION):

数组([lang] =&gt; dr)

登录后

print_r($ _ SESSION):

数组([lang] =&gt; dr [有效] =&gt; 1 [伪] =&gt; GYC [uid] =&gt; 3)

1 个答案:

答案 0 :(得分:5)

现在这是一件事,

print_r($_SESSION) after a click on the english link (set_lang.php above):

Array ( [lang] => dn )

你的问题从set_lang.php开始。 可能会从包含的文件启动会话,但这不应该发生!

如果没有包含set_lang,请确保在那里存在start_session,同时也将print_r放在那里,你甚至可以比较会话id:

让我们说这是index.php

<?php
session_start();  
?>
<a href='set_lang.php?sess=<?PHP echo session_id();?>'>lang</a>

和这个set_lang.php

<?PHP  
session_start(); 
echo 'this is session id from index.php: ',$_GET['sess'],
'and this is session id in set_lang.php:',session_id(),
'and this is the print_r:<br><pre>';
print_r($_SESSION);
?>

您应该看到相同的会话ID。

但是虽然所有这些可能对你有帮助,但我会更进一步,使用单一入口点,不要像这样直接调用php脚本

<a href=somescript.php>link</a>

(除非你正在做一些ajax)而你总是通过index.php调用一些php脚本,如下所示:

<a href=index.php?target=somescript.php>link</a>

这样你就可以在index.php中只放置一次会话开始,登录检查也可以在index.php中完成。

=======================编辑更多信息已添加==================== ===================== 一个快速的谷歌搜索..发现这个小单一入门教程http://www.renownedmedia.com/blog/php-navigation-system-using-single-entry-point/可能会有更好的。

更好的是它将切换到mvc框架(包括单一入口点原则),但因为学习曲线更加陡峭,至少从单一入口点开始。

============ ReEdit再次添加更多信息============================== ============ 一个好的选择就是再次复制这个问题,但是在项目上下文之外,在新创建的文件中尽可能少地从项目中获取代码并尝试再次创建问题。保持尽可能简单只是尝试再次创建错误