【问题标题】:Why does my php `if` not always work?为什么我的 php `if` 并不总是有效?
【发布时间】: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% 正常工作?

我确实在页面上添加了&lt;p class="White"&gt;&lt;?php echo $_SERVER['AUTH_USER']; ?&gt;&lt;/p&gt;,然后在显示名称时它可以正常工作,但是如果我应用未显示名称的样式,它会 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 值没有被保留。我还不知道为什么。我将&lt;?php setcookie("UserName",$_SERVER['AUTH_USER'],time() + (60*60*24*7)); ?&gt; 作为文件的第一行,然后是我的其余代码。所以它是导航到页面时运行的第一件事。

如果我离开页面但未激活,然后返回它是否会重置$_COOKIE?我正在使用var_dump 看看那里有什么。当我没有得到管理员菜单时,$_COOKIE 数组中没有名为“UserName”的结果。它会在一段时间后消失,即使我将它设置为在设置后一周到期。

【问题讨论】:

  • 设置 cookie(我 认为)在脚本结束之前实际上并没有做任何事情,所以你不能设置一个新的 cookie 值然后从那个 cookie 值中读取在同一个脚本上,按这个顺序......
  • @Martin 这就是为什么我将它作为if or。它检查if $_SERVER['AUTH_USER'] or $_COOKIE['UserName'] 是否与数组中的一个用户名匹配。并且文档说它必须在我的脚本的任何输出之前发送。 php.net/manual/en/function.setcookie.php
  • 但是你打电话来检查 cookie 的值;您是否在(可能)设置 cookie 值之后至少调用一个页面加载 cookie 值?
  • @Martin 我在页面加载时调用它,无论是第一个页面加载还是刷新。当我第一次加载页面时调用它时它不存在,但 AUTH_USER 确实(并且已设置)所以 if 仍然是真的。
  • 您可以尝试使用会话而不是 cookie 来存储数据吗?会话与 cookie 是否会出现相同的不一致行为? (他们从不同的角度处理同一个问题)。填写 setcookie 函数上的其余选项也是一个好主意,例如澄清域等,仅用于调试目的。

标签: php webmatrix


【解决方案1】:

这就是我最终不得不做的事情:

在页面的其余代码之前:

<?php 
    if(isset($_COOKIE['UserName']))
    {
        setcookie("UserName",$_COOKIE['UserName'],time() + (60*60*24*7));
    }
    else
    {
        setcookie("UserName",$_SERVER['AUTH_USER'],time() + (60*60*24*7));    
    }
?>

这将确定 $_COOKIE 已为用户名设置。

然后在 HTML 的正文中我有这个:

    <?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');
        }
    ?>

$AdminUsers 是一个包含所有管理员用户名的数组。然后我检查$_SERVER['AUTH_USER']$_COOKIE['UserName'] 是否与数组中的一个用户匹配。到目前为止,我已经能够将页面打开一整个周末,并且仍然可以返回并刷新管理菜单并为我保留原位。

【讨论】:

    猜你喜欢
    • 2011-04-24
    • 2019-08-02
    • 2020-08-10
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多