[英]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'] = dn或dr (应为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.