繁体   English   中英

PHP会话变量丢失

[英]php session variable lost

我在开发机器上使用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'] = dndr (应为en或fr)

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

知道“ d”的来源吗?

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


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

数组([lang] => fr)

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

数组([lang] => dn)

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

数组([lang] => dr)

登录后使用print_r($ _ SESSION):

数组([lang] => dr [valid] => 1 [pseudo] => GYC [uid] => 3)

现在是这样

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中进行。

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

更好的是,将切换到mvc框架(包括单个入口点原理),但是由于学习曲线更加陡峭,至少从单个入口点开始。

============重新编辑更多信息再次添加=============================== ======================================================>这个问题的好选择是再次复制这个问题,但是要脱离项目范围,在新创建的文件中尽可能少地从项目中获取代码,然后再次尝试创建问题。 使其尽可能简单,只需再次尝试创建错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM