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