AndrewMaxwell
Добрый день.
У меня обычная задумка: при входе на сайт определенные ссылки и кнопки видны только администратору. Роль пользователя обозначена в БД и тащится оттуда. Когда пользователь авторизовался — создается сессия, где указана его роль. Но дело в том, что как только я прописываю условия для отображения админских кнопок в представлениях — роль любого пользователя тут же меняется на админа. Я как только не переделывал, не переписывал — ничего не выходит.
Вот код функции логина:
PHP:
<?php function login_user() { $email = $_POST[’email’]; $password = $_POST[‘password’]; $_SESSION[‘login_errors’] = »; $_SESSION[‘user’] = []; global $connection; $_SESSION[‘login_errors’] .= ‘<li>Поле ’email’ не заполнено</li>’; } $_SESSION[‘login_errors’] .= ‘<li>Поле ‘пароль’ не заполнено</li>’; $_SESSION[’email’] .= $email; } $query = «SELECT id, name, password, email, verified, role FROM users WHERE email=»$email«»; $user[$row[‘verified’]] = $row[‘verified’]; $user[$row[‘password’]] = $row[‘password’]; $user[$row[‘id’]] = $row[‘id’]; $user[$row[’email’]] = $row[’email’]; $user[$row[‘role’]] = $row[‘role’]; $user[$row[‘name’]] = $row[‘name’]; if($user[$row[‘verified’]] != 1){ $_SESSION[‘login_errors’] .= ‘<li>Аккаунт еще не подтвержден</li>’; } if(!password_verify($password, $user[$row[‘password’]])){ $_SESSION[‘login_errors’] .= ‘<li>Неверный пароль</li>’; } $_SESSION[‘user’][‘name’] = $user[$row[‘name’]]; $_SESSION[‘user’][‘id’] = $user[$row[‘id’]]; $_SESSION[‘user’][‘role’] = $user[$row[‘role’]]; } } } return $_SESSION[‘user’]; }
Drunkenmunky
Много лишнего.
1. Получить данные из формы, обработать, отправить запрос в базу.
2. Если поля совпадают записать в сессию «ok» плюс попутные необходимые данные(имя, роль, локацию и тд.).
3.Перенаправить на главную, где из сессии извлекать состояние авторизации и прочее.
4. Если авторизация «ок», то одно, другое, пятое десятое.
5. Если нужно неавторизованным отображать что-то отдельное, то отображать.
AndrewMaxwell
Я все равно не понимаю, почему роль в сессии меняется на админа, как только я прописываю условия в представлениях?
Вот, например:
PHP:
<?php if ($_SESSION[‘user’][‘role’] = ‘admin’) :?> <h5 class=»add-article»> <a href=»<?php PATH?>addnews»>Добавить новость</a></h5> <?php endif;?>Юзер не админ, в бд это четко указано. И в функции логина так же четко указано, чему должна роль в массиве сессии соответствовать. Где может быть косяк?
Drunkenmunky
Потому что вот так:
Код (Text):
$_SESSION[‘user’][‘role’] = ‘admin’)вы присваиваете, а не сравниваете.
Сравнение ==
AndrewMaxwell
Ну, елки зеленые, точно спасибо
artoodetoo
неужели это работает?
для проверки роли лучше создай функции типа isAdmin() isGuest() и т.д. — нагляднее, безопаснее в плане опечаток и править в одном месте надо когда что-то переделываешь.
AndrewMaxwell
Работает, а лучше по-другому как-то?
Спасибо за совет!
artoodetoo
ну это не ошибка, просто <?php PATH ?> не выводит н и ч е г о )))
Код (Text):
$ cat test.php <?php define(‘PATH’, ‘qwertyui’); ?> <a href=»<?php%20PATH?>addnews»> $ php test.php <a href=»addnews»>наверное надо так: <?= PATH ?>
AndrewMaxwell
Честно говоря, не знаю. У меня ссылка открывается как надо, без проблем. Да они вообще все таким образом написаны.
artoodetoo
Не знаешь, так вникай в то, что тебе пишут Ссылка конечно может открываться как надо, если тот кусок кода вообще не был нужен.
AndrewMaxwell
Я поменял. А что значит «если тот кусок кода вообще не был нужен»? Просто у меня все ссылки в коде по одному разу только встречаются.
artoodetoo
@AndrewMaxwell я не знаю как тебе объяснить.
смотри: вот этот код не делает ничего (полезного)
PHP:
echo »; 1234567; 1=1;он не приводит к ошибке, но он ничего не добавляет в твою программу, только ухудшает твою карму. программа будет работать и с этим кодом, и без него одинаково.
и <?php PATH ?> такой же ))) понял?
AndrewMaxwell
<?php PATH?> ничего не выводит, это я понимаю. Но ведь у меня-то выводил почему-то. При том, что эта конкретная ссылка «Добавить новость» встречается только в одном экземпляре во всем коде — в представлении главной страницы. Такая же история и с логином/регистрацией. Из-за чего это могло быть-то?
roboformation
<a href=»addnews»> — потому что у тебя ещё кое-что есть здесь
don.bidon
Тут либо $user[‘verified’] = …, либо вообще $user = $row, иначе наркомания какая-то получается.