Я сделал страницу входа в систему, которая работает нормально. У каждой учетной записи в моей системе есть имя пользователя, пароль и разрешение. На экране входа в систему вам нужно только ввести свое имя пользователя и пароль, и запись будет автоматически связана с сеансом, поэтому я уверен, что сеанс знает, какое разрешение он имеет при входе в систему. Я хочу сделать разницу между администратором и учетная запись пользователя. Учетная запись администратора должна быть перенаправлена на другой экран в качестве пользователя. Это мой код:
if ($_SESSION['Permission'] = "admin") {
header("location:adminmenu.html");
} else {
header("location:usermenu.html");
}
Когда я запускаю это, он автоматически переводит меня в меню администратора, даже если оператор неверен. Как я могу это исправить?
Это не одно и то же, потому что вопрос не в ошибках синтаксического анализа.
Даже если я изменю это, он все равно будет перенаправлять меня каждый раз в административное меню.
Вы назначили разрешение на сеанс, поэтому вам нужно сначала уничтожить сеанс и убедиться, что этого больше нигде не произойдет.
Обычно рекомендуется попрактиковаться в записи if ('foo' == $var) вместо if ($var == 'foo'), чтобы, если вы пропустите один =, выдаст ошибку.
Я добавил session_destroy (); и session_start (); перед оператором, теперь он перенаправляет только на usermenu.html.
Он по-прежнему не работает должным образом, правильно ли я использую $ SESSION ['Permission']?
@IMB это? Думаю, я вижу, что опция $ var == 'foo' более широко используется, почти никогда не встречал 'foo' == $ var? кажется больше предпочтением, чем хорошей практикой ... ваша точка зрения верна в отношении декларации, но просто укажите правильное количество == / != ...?
@fdssfd var_dump $ _SESSION ['Permission'] и посмотрите, какое значение имеет значение для каждого пользователя.
@ThisGuyHasTwoThumbs См. Условия Йоды, на что также указал Роберт в своем ответе ниже.
@IMB, знакомый с ними, лично я просто не вижу в этом смысла лично - я предпочитаю сравнивать значение с var, а не var со значением (если это имеет смысл), и я просто всегда проверяю, что использую правильное количество == .. думаю, для меня это никогда не было проблемой (но хаха)






Проверьте следующее:
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 (), которая проверяет, существует ли разрешение в массиве сеанса, потому что, когда вы не проверяете его, вы получите уведомление о несуществующем индексе.
Вы назначаете
=, а не сравниваете,==или===.