其中一个SESSION变量发生了变化

时间:2012-09-11 00:36:41

标签: php session session-variables

我正在开发一个具有每个角色的用户界面和功能的Web应用程序。在users表中,我有一个role列,enum,用于存储每个用户的角色。在登录脚本中,如果找到user / pass的匹配记录,我将SESSION['role']变量设置为记录的角色字段的值。除了角色之外,我还存储了其他一些数据,例如其他SESSION变量中的display_name。然后,在整个应用程序中使用SESSION['role']将正确的用户界面发送到浏览器并强制执行访问规则。

这在我的本地主机上工作正常,但在远程服务器上,SESSION['role']只是第一次工作 - 即将正确的用户界面发送到浏览器。在此之后,SESSION['role']以某种方式更改为不同的(现有)角色,因此访问规则不允许这些功能可用。更奇怪的是,只有SESSION['role']次更改且SESSION['displayname']SESSION['username']保持不变。

我没有在SESSION以外的地方设置login.php个变量。我非常感谢任何我应该寻找潜在原因的想法。

2 个答案:

答案 0 :(得分:1)

检查您的数据库结构是否相同。最值得注意的是,ENUM具有相同的角色/标识符。如果指定的值无效,则SQL将在“STRICT MODE”中失败,否则它将回退到其中一个值。

(提示:除非出于某种原因不这样做,否则总是以“严格模式”开发。然后在分发到现场时你不会被串起来。)

如果您有一个带有角色的单独表(例如LEFT JOIN),请检查它。

答案 1 :(得分:0)

我发现了问题。在prod服务器register_globals上启用了(顺便说一下,这是PHP 5.3.6的无味选择)。

然而,我没有怀疑是因为我是因为我不知道它是如何影响超级全局的。我虽然开启register_globals相当于在所有脚本的开头添加了这段代码:

foreach($_SESSION as $kn => $val) eval("$kn = $val;");
same for other super globals ...

换句话说,我认为定义$_SESSION['role']并等于'Manager'与此行具有相同的效果:

$role = $_SESSION['role'];
or
$role = 'Manager';

但这只是故事的一半作为

下面的第二行
$role = $_SESSION['role'];
$role = 'Something else';

不影响SESSION['role'],它的价值仍然是它的价值。但是,如果register_globals处于启用状态,则更改$role会更改$_SESSION['role']