2011-10-12 204 views
2

我在开发机器上使用php5和apache2。生产服务器显然是相似的。php会话变量丢失

我有一个创建一个会话变量脚本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 [ '郎'] = DN博士(应该是EN或FR)

回声$ LANG [sometexttotranslate] = d(应该是翻译的文字)

任何想法,在 “d” 的从何而来?

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


的print_r($ _ SESSION)上第一负载:

英语链路(set_lang上的点击后阵列([郎] => FR)

的print_r($ _ SESSION)。以上PHP):

阵列([郎] => DN)

的print_r($ _ SESSION)AFTE法国链路上RA单击(上述set_lang.php):

阵列

的print_r($ _ SESSION)登录后([郎] => DR):

阵列([郎] =>博士[有效] => 1 [伪] => GYC [UID] => 3)

+0

嗯...炒位... –

+0

@Ignacio我不知道在这个问题的背景是什么,但我完全同意。油炸松脆的零食是美味的,应该是每种美食的基础。 –

+0

print_r会话显示什么,也许会比较会话ID。 – Melsi

回答

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太:

让我们说这是指数。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框架(包括单入口点哲学),但由于学习曲线更陡峭,至少从单一入口点开始。

============重新编辑的详细信息再次添加============================ ============== 一个很好的选项,然后将再次复制这一问题,但你的项目背景下,承担尽可能少的代码从您的项目在新创建的文件,并尝试建立问题再次出现。保持尽可能简单,只是尝试创建错误再次

+0

谢谢,但问题并非来自我的网站的结构。一切工作在php5.3.3的开发服务器上,但生产服务器有php5.2.6我不认为这两个版本之间的会话处理有变化。在我的会话名称中插入'd'的地方有一个错误,但我无法确定在哪里。两个服务器上的代码都完全相同。 –

+0

谢谢。我用几行代码重现了这个问题。 (我接受你的答案)。请看看这个问题http://stackoverflow.com/questions/7749060/php-session-variables-change-with-file-include –