php会话变量丢失了

龚元程*_*龚元程 2 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();
?>
Run Code Online (Sandbox Code Playgroud)

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

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');
}
Run Code Online (Sandbox Code Playgroud)

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

echo $lang[sometexttotranslate];
Run Code Online (Sandbox Code Playgroud)

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

在生产服务器上:

$ _SESSION ['lang'] = dndr(应该是en或fr)

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

知道"d"来自哪里?

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


第一次加载时print_r($ _ SESSION):

数组([lang] => fr)

单击英文链接(上面的set_lang.php)后打印__($ _ SESSION):

数组([lang] => dn)

单击法语链接(上面的set_lang.php)后的print_r($ _ SESSION):

数组([lang] => dr)

登录后print_r($ _ SESSION):

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

Mel*_*lsi 5

现在这是事情,

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

Array ( [lang] => dn )
Run Code Online (Sandbox Code Playgroud)

你的问题从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>
Run Code Online (Sandbox Code Playgroud)

这个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);
?>
Run Code Online (Sandbox Code Playgroud)

你应该看到相同的会话ID.

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

<a href=somescript.php>link</a>
Run Code Online (Sandbox Code Playgroud)

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

<a href=index.php?target=somescript.php>link</a>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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