1

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

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

我没有SESSION在除login.php. 非常感谢我应该寻找潜在原因的任何想法。

4

2 回答 2

1

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

(提示:总是在“严格模式”下开发,除非有什么理由不这样做。那么你在分发直播时不会被串起来)。

如果您有一个包含角色的单独表(例如 LEFT JOIN),请也检查一下。

于 2012-09-11T00:58:03.807 回答
0

我发现了问题。在 prod 服务器register_globals上(顺便说一句,这对于 PHP 5.3.6 来说是一个无味的选择)。

但是,我并不怀疑这是原因,因为我不知道它是如何影响超级全局变量的。我认为register_globalson 相当于在所有脚本的开头添加这段代码:

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']

于 2012-09-11T15:07:49.177 回答