За последние 24 часа нас посетили 16133 программиста и 1586 роботов. Сейчас ищут 1359 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем AndrewMaxwell, 22 мар 2021.

Метки:
  1. AndrewMaxwell

    AndrewMaxwell Новичок

    С нами с:
    21 окт 2020
    Сообщения:
    10
    Симпатии:
    0
    Добрый день.

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

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

    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. }
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.484
    Симпатии:
    281
    Много лишнего.
    1. Получить данные из формы, обработать, отправить запрос в базу.
    2. Если поля совпадают записать в сессию "ok" плюс попутные необходимые данные(имя, роль, локацию и тд.).
    3.Перенаправить на главную, где из сессии извлекать состояние авторизации и прочее.
    4. Если авторизация "ок", то одно, другое, пятое десятое.
    5. Если нужно неавторизованным отображать что-то отдельное, то отображать.
     
  3. AndrewMaxwell

    AndrewMaxwell Новичок

    С нами с:
    21 окт 2020
    Сообщения:
    10
    Симпатии:
    0
    Я все равно не понимаю, почему роль в сессии меняется на админа, как только я прописываю условия в представлениях?

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

    PHP:
    1. <?php if ($_SESSION['user']['role'] = 'admin') :?>
    2.             <h5 class="add-article">
    3.                 <a href="<?php PATH?>addnews">Добавить новость</a></h5>
    4.             <?php endif;?>
    Юзер не админ, в бд это четко указано. И в функции логина так же четко указано, чему должна роль в массиве сессии соответствовать. Где может быть косяк?
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.484
    Симпатии:
    281
    Потому что вот так:
    Код (Text):
    1. $_SESSION['user']['role'] = 'admin')
    вы присваиваете, а не сравниваете.
    Сравнение ==
     
  5. AndrewMaxwell

    AndrewMaxwell Новичок

    С нами с:
    21 окт 2020
    Сообщения:
    10
    Симпатии:
    0
    Ну, елки зеленые, точно:D спасибо
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.106
    Симпатии:
    1.243
    Адрес:
    там-сям
    неужели это работает?

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

    AndrewMaxwell Новичок

    С нами с:
    21 окт 2020
    Сообщения:
    10
    Симпатии:
    0
    Работает, а лучше по-другому как-то?

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

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.106
    Симпатии:
    1.243
    Адрес:
    там-сям
    ну это не ошибка, просто <?php PATH ?> не выводит н и ч е г о )))

    Код (Text):
    1.  
    2. $ cat test.php
    3. <?php
    4.  
    5. define('PATH', 'qwertyui');
    6.  
    7. ?>
    8.  
    9. <a href="<?php PATH?>addnews">
    10.  
    11.  
    12. $ php test.php
    13.  
    14. <a href="addnews">
    наверное надо так: <?= PATH ?>
     
  9. AndrewMaxwell

    AndrewMaxwell Новичок

    С нами с:
    21 окт 2020
    Сообщения:
    10
    Симпатии:
    0
    Честно говоря, не знаю. У меня ссылка открывается как надо, без проблем. Да они вообще все таким образом написаны.
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.106
    Симпатии:
    1.243
    Адрес:
    там-сям
    Не знаешь, так вникай в то, что тебе пишут :) Ссылка конечно может открываться как надо, если тот кусок кода вообще не был нужен.
     
  11. AndrewMaxwell

    AndrewMaxwell Новичок

    С нами с:
    21 окт 2020
    Сообщения:
    10
    Симпатии:
    0
    Я поменял. А что значит "если тот кусок кода вообще не был нужен"? Просто у меня все ссылки в коде по одному разу только встречаются.
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.106
    Симпатии:
    1.243
    Адрес:
    там-сям
    @AndrewMaxwell я не знаю как тебе объяснить. :)

    смотри: вот этот код не делает ничего (полезного)
    PHP:
    1. echo '';
    2. 1234567;
    3. 1=1;
    он не приводит к ошибке, но он ничего не добавляет в твою программу, только ухудшает твою карму. программа будет работать и с этим кодом, и без него одинаково.
    и <?php PATH ?> такой же ))) понял?
     
  13. AndrewMaxwell

    AndrewMaxwell Новичок

    С нами с:
    21 окт 2020
    Сообщения:
    10
    Симпатии:
    0
    <?php PATH?> ничего не выводит, это я понимаю. Но ведь у меня-то выводил почему-то. При том, что эта конкретная ссылка "Добавить новость" встречается только в одном экземпляре во всем коде - в представлении главной страницы. Такая же история и с логином/регистрацией. Из-за чего это могло быть-то?
     
  14. roboformation

    roboformation Активный пользователь

    С нами с:
    30 авг 2020
    Сообщения:
    162
    Симпатии:
    40
    <a href="addnews"> - потому что у тебя ещё кое-что есть здесь
     
  15. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    Тут либо $user['verified'] = ..., либо вообще $user = $row, иначе наркомания какая-то получается.