我正在开发一个具有每个角色的用户界面和功能的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
个变量。我非常感谢任何我应该寻找潜在原因的想法。
答案 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']
。