Проблема с сессиями

AndrewMaxwell

Добрый день.

У меня обычная задумка: при входе на сайт определенные ссылки и кнопки видны только администратору. Роль пользователя обозначена в БД и тащится оттуда. Когда пользователь авторизовался — создается сессия, где указана его роль. Но дело в том, что как только я прописываю условия для отображения админских кнопок в представлениях — роль любого пользователя тут же меняется на админа. Я как только не переделывал, не переписывал — ничего не выходит.

Вот код функции логина:

PHP:
  1. <?php
  2. function login_user()
  3. {
  4.     $email = $_POST[’email’];
  5.     $password = $_POST[‘password’];
  6.     $_SESSION[‘login_errors’] = »;
  7.     $_SESSION[‘user’] = [];
  8.     global $connection;
  9.  
  10.     if (empty($email)) {
  11.         $_SESSION[‘login_errors’] .= ‘<li>Поле ’email’ не заполнено</li>’;
  12.     }
  13.  
  14.     if (empty($password)) {
  15.         $_SESSION[‘login_errors’] .= ‘<li>Поле ‘пароль’ не заполнено</li>’;
  16.         $_SESSION[’email’] .= $email;
  17.     }
  18.  
  19.     if(empty($_SESSION[‘login_errors’])){
  20.         $query = «SELECT id, name, password, email, verified, role
  21.        FROM users WHERE email=»$email«»;
  22.         $res = mysqli_query($connection, $query);
  23.         while($row = mysqli_fetch_assoc($res)){
  24.             $user[$row[‘verified’]] = $row[‘verified’];
  25.             $user[$row[‘password’]] = $row[‘password’];
  26.             $user[$row[‘id’]] = $row[‘id’];
  27.             $user[$row[’email’]] = $row[’email’];
  28.             $user[$row[‘role’]] = $row[‘role’];
  29.             $user[$row[‘name’]] = $row[‘name’];
  30.             if($user[$row[‘verified’]] != 1){
  31.                 $_SESSION[‘login_errors’] .= ‘<li>Аккаунт еще не подтвержден</li>’;
  32.             }
  33.             if(!password_verify($password, $user[$row[‘password’]])){
  34.                 $_SESSION[‘login_errors’] .= ‘<li>Неверный пароль</li>’;
  35.             }
  36.  
  37.             if(empty($_SESSION[‘login_errors’])) {
  38.                 $_SESSION[‘user’][‘name’] = $user[$row[‘name’]];
  39.                 $_SESSION[‘user’][‘id’] = $user[$row[‘id’]];
  40.                 $_SESSION[‘user’][‘role’] = $user[$row[‘role’]];
  41.             }
  42.         }
  43.     }
  44.     return $_SESSION[‘user’];
  45. }
 

Drunkenmunky

Много лишнего.
1. Получить данные из формы, обработать, отправить запрос в базу.
2. Если поля совпадают записать в сессию «ok» плюс попутные необходимые данные(имя, роль, локацию и тд.).
3.Перенаправить на главную, где из сессии извлекать состояние авторизации и прочее.
4. Если авторизация «ок», то одно, другое, пятое десятое.
5. Если нужно неавторизованным отображать что-то отдельное, то отображать.

 

AndrewMaxwell

Я все равно не понимаю, почему роль в сессии меняется на админа, как только я прописываю условия в представлениях?

Вот, например:

PHP:
  1. <?php if ($_SESSION[‘user’][‘role’] = ‘admin’) :?>
  2.             <h5 class=»add-article»>
  3.                 <a href=»<?php PATH?>addnews»>Добавить новость</a></h5>
  4.             <?php endif;?>

Юзер не админ, в бд это четко указано. И в функции логина так же четко указано, чему должна роль в массиве сессии соответствовать. Где может быть косяк?

 

Drunkenmunky

Потому что вот так:

Код (Text):
  1. $_SESSION[‘user’][‘role’] = ‘admin’)

вы присваиваете, а не сравниваете.
Сравнение ==

 

AndrewMaxwell

Ну, елки зеленые, точно:D спасибо

 

artoodetoo

неужели это работает?

для проверки роли лучше создай функции типа isAdmin() isGuest() и т.д. — нагляднее, безопаснее в плане опечаток :) и править в одном месте надо когда что-то переделываешь.

 

AndrewMaxwell

Работает, а лучше по-другому как-то?

Спасибо за совет!

 

artoodetoo

ну это не ошибка, просто <?php PATH ?> не выводит н и ч е г о )))

Код (Text):
  1.  
  2. $ cat test.php
  3. <?php
  4.  
  5. define(‘PATH’, ‘qwertyui’);
  6.  
  7. ?>
  8.  
  9. <a href=»<?php%20PATH?>addnews»>
  10.  
  11.  
  12. $ php test.php
  13.  
  14. <a href=»addnews»>

наверное надо так: <?= PATH ?>

 

AndrewMaxwell

Честно говоря, не знаю. У меня ссылка открывается как надо, без проблем. Да они вообще все таким образом написаны.

 

artoodetoo

Не знаешь, так вникай в то, что тебе пишут :) Ссылка конечно может открываться как надо, если тот кусок кода вообще не был нужен.

 

AndrewMaxwell

Я поменял. А что значит «если тот кусок кода вообще не был нужен»? Просто у меня все ссылки в коде по одному разу только встречаются.

 

artoodetoo

@AndrewMaxwell я не знаю как тебе объяснить. :)

смотри: вот этот код не делает ничего (полезного)

PHP:
  1. echo »;
  2. 1234567;
  3. 1=1;

он не приводит к ошибке, но он ничего не добавляет в твою программу, только ухудшает твою карму. программа будет работать и с этим кодом, и без него одинаково.
и <?php PATH ?> такой же ))) понял?

 

AndrewMaxwell

<?php PATH?> ничего не выводит, это я понимаю. Но ведь у меня-то выводил почему-то. При том, что эта конкретная ссылка «Добавить новость» встречается только в одном экземпляре во всем коде — в представлении главной страницы. Такая же история и с логином/регистрацией. Из-за чего это могло быть-то?

 

roboformation

<a href=»addnews»> — потому что у тебя ещё кое-что есть здесь

 

don.bidon

Тут либо $user[‘verified’] = …, либо вообще $user = $row, иначе наркомания какая-то получается.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *