【发布时间】:2016-11-11 06:55:54
【问题描述】:
我有一个 Intranet 网站,我设置了 2 个不同的菜单。我使用 PHP 根据谁登录来显示菜单。这就是我所拥有的:
<?php
if ($_SERVER['AUTH_USER'] == 'CORP\mmm976' || $_SERVER['AUTH_USER'] == 'CORP\ibb601' || $_SERVER['AUTH_USER'] == 'corp\mmm976'){
include('AdminMenu.php');
}else {
include('Menu.php');
}
?>
有时有效,有时无效。我是管理员之一,有时我无法使用AdminMenu?这是怎么回事,我该如何解决这个问题,让它 100% 正常工作?
我确实在页面上添加了<p class="White"><?php echo $_SERVER['AUTH_USER']; ?></p>,然后在显示名称时它可以正常工作,但是如果我应用未显示名称的样式,它会 100% 停止工作。至于它是否会给我AdminMenu,会受到打击或错过。
我已经开启了 Windows 身份验证并关闭了匿名身份验证。 $_SERVER['AUTH_USER'] 有一个值,除非我在页面上打印它,否则它并不总是使用它。
编辑
我刚刚有一个实例,我有一个页面设置来显示我的用户名。我在另一个页面上呆了大约 20 到 30 分钟,当我回来时,它没有显示我的用户名,也没有给我AdminMenu。当我导航到我的主页(我可以使用 asp.net 来查看谁登录了)然后返回时,它再次显示我的用户名和AdminMenu。
EDIT2
我以为我想通了。
并不是if 并不总是有效,而是每次我刷新页面时我的用户名都没有发送到服务器。当我刷新并且我的用户名没有被发送时,if 做了它应该做的事情并且没有给我管理菜单。为了解决这个问题,我最终使用了全局 $_COOKIE 变量来保留我的用户名(持续 7 天):
<?php setcookie("UserName",$_SERVER['AUTH_USER'],time() + (60*60*24*7)); ?>
然后必须将其添加到 if 中,因为直到您第一次刷新后才能使用它:
<?php
$AdminUsers = array("CORP\User1","CORP\User2");
if (in_array($_SERVER['AUTH_USER'],$AdminUsers,TRUE) || in_array($_COOKIE['UserName'],$AdminUsers,TRUE))
{
include('AdminMenu.php');
}
else
{
include('Menu.php');
}
?>
但是我今天发现 $_COOKIE 值没有被保留。我还不知道为什么。我将<?php setcookie("UserName",$_SERVER['AUTH_USER'],time() + (60*60*24*7)); ?> 作为文件的第一行,然后是我的其余代码。所以它是导航到页面时运行的第一件事。
如果我离开页面但未激活,然后返回它是否会重置$_COOKIE?我正在使用var_dump 看看那里有什么。当我没有得到管理员菜单时,$_COOKIE 数组中没有名为“UserName”的结果。它会在一段时间后消失,即使我将它设置为在设置后一周到期。
【问题讨论】:
-
设置 cookie(我 认为)在脚本结束之前实际上并没有做任何事情,所以你不能设置一个新的 cookie 值然后从那个 cookie 值中读取在同一个脚本上,按这个顺序......
-
@Martin 这就是为什么我将它作为
ifor。它检查if$_SERVER['AUTH_USER']or$_COOKIE['UserName']是否与数组中的一个用户名匹配。并且文档说它必须在我的脚本的任何输出之前发送。 php.net/manual/en/function.setcookie.php -
但是你打电话来检查 cookie 的值;您是否在(可能)设置 cookie 值之后至少调用一个页面加载 cookie 值?
-
@Martin 我在页面加载时调用它,无论是第一个页面加载还是刷新。当我第一次加载页面时调用它时它不存在,但
AUTH_USER确实(并且已设置)所以if仍然是真的。 -
您可以尝试使用会话而不是 cookie 来存储数据吗?会话与 cookie 是否会出现相同的不一致行为? (他们从不同的角度处理同一个问题)。填写
setcookie函数上的其余选项也是一个好主意,例如澄清域等,仅用于调试目的。