【发布时间】:2011-10-13 03:14:21
【问题描述】:
这个问题基于之前的question I asked,但由于我不确定问题可能来自哪里,所以编辑变得很混乱。 (请告知此问题是否需要关闭)
我在开发环境 + Apache 2 上使用 PHP 5.3.3 进行开发(我的代码在那里工作) 生产服务器有 PHP 5.2.6 和相同的服务器(相同的代码在这里不起作用)
感谢 Melsi 的另一个问题,我设法将问题缩小到几行代码。
问题是:在一个包含文件中,我启动一个会话并检查一个变量。 根据该会话变量,我包含一个语言文件。
结构是这样的:
-index.php
INCLUDE
-menus.php
-lang_fr.php
-lang_en.php
文件如下:
索引.PHP
<?php
//SET LANGUAGE
if (isset($_GET['lang']) && $_GET['lang'] == 'fr') {
$_SESSION['lang'] = 'fr';
}
else if (isset($_GET['lang']) && $_GET['lang'] == 'en') {
$_SESSION['lang'] = 'en';
}
else {
$_SESSION['lang'] = 'en';
}
include_once 'include/menus.php';
?>
<html>
<head>
<title>building...</title>
</head>
<body>
<?php
echo($links);
?>
<br><br>
print_r($_SESSION);
<br><br>
<?php
print_r($_SESSION);
?>
</body>
</html>
菜单.PHP
<?php
session_start();
if(isset($_SESSION['lang']) && $_SESSION['lang'] == 'en') {
include_once('lang_en.php');
}
else if(isset($_SESSION['lang']) && $_SESSION['lang'] == 'fr') {
include_once('lang_fr.php');
}
else {
$_SESSION['lang'] = 'fr';
include_once('lang_fr.php');
}
$links = <<<EOT
<a href="/index.php?lang=en">English</a>
<a href="/index.php?lang=fr">French</a>
EOT;
?>
LAN_EN 和 FR.PHP
<?php
$lang['test'] = "Test";
?>
这在我的本地服务器上工作并在我单击链接时显示正确的会话变量。
在我得到的生产服务器上:
-首次加载:Array ([lang] => fr)(默认,正确)
-点击英文链接:Array ( [lang] => Tn )
-点击法语链接:Array ( [lang] => Tr )
如果我将语言文件 'Test' 更改为 'Pest',上面的结果是 'Pn' 和 'Pr'
我想知道代码或配置生产服务器是否有问题(根据他们的支持没有问题),如果是,可能是什么问题。
注意:当我删除 menus.php 中的包含时,问题就消失了
【问题讨论】:
-
允许偶尔重复,这里的代码与您的第一个问题完全不同。 -- 你应该修复的第一件事是你草率的格式和/或花括号(省略通常是不好的)。目前尚不清楚您的第一个 sn-p 的行为方式。 -- 其次,您的问题可能是 $_SESSION 变量被映射到全局范围。因此
$lang['text']=赋值实际上覆盖了共享会话/全局$lang变量的第一个[0]字符。 -
好吧,收回来,代码看起来很棒。 -- 检查
register_globals是否已启用以及重复中提到的 PHP 5.2.x 中的兼容性标志。如果完全相同的代码在您的开发系统上运行良好,那么它在您的生产服务器上肯定是一个垃圾配置。 -
查看
phpinfo()。或print_r(ini_get_all());。这应该告诉您与 register_globals 和会话错误有关的确切配置。这实际上是您应该与托管服务交谈的少数危险设置之一 - 如果它存在的话。 -
是的,它应该敲响警钟。 php.net/manual/en/security.globals.php
标签: php session-variables