Как мне проверить разрешения в сеансе?

Я сделал страницу входа в систему, которая работает нормально. У каждой учетной записи в моей системе есть имя пользователя, пароль и разрешение. На экране входа в систему вам нужно только ввести свое имя пользователя и пароль, и запись будет автоматически связана с сеансом, поэтому я уверен, что сеанс знает, какое разрешение он имеет при входе в систему. Я хочу сделать разницу между администратором и учетная запись пользователя. Учетная запись администратора должна быть перенаправлена ​​на другой экран в качестве пользователя. Это мой код:

if ($_SESSION['Permission'] = "admin") { 
    header("location:adminmenu.html");
} else {
    header("location:usermenu.html"); 
}

Когда я запускаю это, он автоматически переводит меня в меню администратора, даже если оператор неверен. Как я могу это исправить?

Это не одно и то же, потому что вопрос не в ошибках синтаксического анализа.

Вы назначаете =, а не сравниваете, == или ===.

jeroen 08.11.2018 09:00

Даже если я изменю это, он все равно будет перенаправлять меня каждый раз в административное меню.

fdssfd 08.11.2018 09:02

Вы назначили разрешение на сеанс, поэтому вам нужно сначала уничтожить сеанс и убедиться, что этого больше нигде не произойдет.

jeroen 08.11.2018 09:03

Обычно рекомендуется попрактиковаться в записи if ('foo' == $var) вместо if ($var == 'foo'), чтобы, если вы пропустите один =, выдаст ошибку.

IMB 08.11.2018 09:03

Я добавил session_destroy (); и session_start (); перед оператором, теперь он перенаправляет только на usermenu.html.

fdssfd 08.11.2018 09:06

Он по-прежнему не работает должным образом, правильно ли я использую $ SESSION ['Permission']?

fdssfd 08.11.2018 09:11

@IMB это? Думаю, я вижу, что опция $ var == 'foo' более широко используется, почти никогда не встречал 'foo' == $ var? кажется больше предпочтением, чем хорошей практикой ... ваша точка зрения верна в отношении декларации, но просто укажите правильное количество == / != ...?

treyBake 08.11.2018 09:55

@fdssfd var_dump $ _SESSION ['Permission'] и посмотрите, какое значение имеет значение для каждого пользователя.

treyBake 08.11.2018 09:56

@ThisGuyHasTwoThumbs См. Условия Йоды, на что также указал Роберт в своем ответе ниже.

IMB 08.11.2018 10:08

@IMB, знакомый с ними, лично я просто не вижу в этом смысла лично - я предпочитаю сравнивать значение с var, а не var со значением (если это имеет смысл), и я просто всегда проверяю, что использую правильное количество == .. думаю, для меня это никогда не было проблемой (но хаха)

treyBake 08.11.2018 10:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
10
379
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Проверьте следующее:

1.) Используйте сравнение вместо назначения

if ($_SESSION['Permission'] === "admin") { 
header("location:adminmenu.html");
} else {
header("location:usermenu.html"); 
}

2.) Убедитесь, что вы запускаете session_start () для каждого запроса

3.) Убедитесь, что $ _SESSION ['Permission'] установлено, запустите var_dump ($ _ SESSION); чтобы убедиться, что значение установлено правильно.

Убедитесь, что при сравнении значений у вас ==, а не =. Также посмотрите, есть ли session_start(); вверху страницы.

session_start();
if ($_SESSION['Permission'] == "admin") { 
header("location:adminmenu.html");
} else {
header("location:usermenu.html"); 
}

Это потому, что вместо сравнения вы назначаете административное значение $ _SESSSION ['Permision'], и оно возвращается в оператор if. Затем в операторе if будет проверяться, является ли "admin" == true, что в данном случае истинно.

Самый простой способ избежать этого - использовать YODA Выражения с тернарными операторами, это упрощает код.

session_start();
header('Location: ' . isset($_SESSION['Permission'] && 'admin' === $_SESSION['Permission'] ? 'admin' : 'user' . 'menu.html');

он делает то же, что и код ниже (с точки зрения результата)

if (isset($_SESSION['Permission'] && "admin" === $_SESSION['Permission']) {
   header("Location: adminmenu.html");
} else {
   header("Location: usermenu.html");
}

Обратите внимание также на наличие функции isset (), которая проверяет, существует ли разрешение в массиве сеанса, потому что, когда вы не проверяете его, вы получите уведомление о несуществующем индексе.

Другие вопросы по теме