【问题标题】:php session variable lostphp会话变量丢失
【发布时间】:2011-12-05 20:32:57
【问题描述】:

我在我的开发机器上使用 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() 问题。


首次加载时打印_r($_SESSION):

数组 ( [lang] => fr )

print_r($_SESSION) 点击英文链接(上面的set_lang.php)后:

数组([lang] => dn)

print_r($_SESSION) 点击法语链接(上面的set_lang.php)后:

数组([lang] => dr)

登录后打印_r($_SESSION):

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

【问题讨论】:

  • @Ignacio 我不知道问题的上下文是什么,但我完全同意。炸脆的小块美味,应该是每道菜的基础。
  • print_r 会话显示什么,也许也比较会话 id。
  • @Melsi:我用 print_r 结果更新了问题

标签: php session-variables


【解决方案1】:

现在是这样,

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 框架(包括单一入口点理念),但因为学习曲线更加陡峭,至少从单一入口点开始。

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

【讨论】:

  • 谢谢,但问题不在于我的网站结构。一切都在 php5.3.3 的开发服务器上工作,但生产服务器有 php5.2.6 我不相信 2 个版本之间的会话处理有变化。某处有一个错误,在我的会话名称中插入了一个“d”,但我不知道在哪里。两台服务器上的代码完全相同。
  • 谢谢。我用几行代码重现了这个问题。 (我接受你的回答)。请看问题stackoverflow.com/questions/7749060/…
猜你喜欢
  • 2011-04-15
  • 2014-08-14
  • 1970-01-01
  • 2011-03-09
  • 2012-10-18
  • 2023-01-23
  • 2018-11-30
相关资源
最近更新 更多