2016-07-08 7 views
1

У меня есть сайт интрасети, который я установил с помощью двух разных меню. Я использую PHP, чтобы отобразить меню на основе вошедший в этом то, что у меня есть:.Почему мой php `if` не всегда работает?

<?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'] имеет значение, которое он просто не всегда использует, если я не печатаю его на странице.

EDIT

Я просто был случай, когда у меня есть настройки страницы, чтобы показать свое имя пользователя. Я был на другой странице около 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». Через некоторое время он просто уходит, хотя я истекаю через неделю после его установки.

+0

Установить cookie (I * think *) на самом деле ничего не делает до конца скрипта, поэтому вы не можете установить новое значение cookie, а затем прочитать из этого значения cookie в том же скрипте в этом порядке. .. – Martin

+0

@Martin Вот почему у меня это как 'if'' или'. Он проверяет 'if'' '_SERVER ['AUTH_USER']' 'или' '$ _COOKIE ['UserName']' соответствует совпадению с одним из имен пользователей в массиве. И в документации говорится, что он должен быть отправлен до выхода из моего сценария. http://php.net/manual/en/function.setcookie.php – Mike

+0

, но вы звоните, чтобы проверить, является ли значение cookie; вы вызываете значение cookie как минимум на одну загрузку страницы * после * вы (потенциально) устанавливаете значение cookie? – Martin

ответ

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 уже установлен для UserName.

Тогда в теле 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'] одному из пользователей в массиве. До сих пор я мог оставить страницу открытой на целый уик-энд и все еще возвращаться и обновляться, когда меню администратора остается на месте.

Смежные вопросы