За последние 24 часа нас посетили 16644 программиста и 1572 робота. Сейчас ищут 735 программистов ...

Как правильно записать в сессию

Тема в разделе "PHP для новичков", создана пользователем ALOE, 17 дек 2017.

  1. ALOE

    ALOE Новичок

    С нами с:
    17 дек 2017
    Сообщения:
    9
    Симпатии:
    0
    Приветствую всех!
    Пользуюсь php7 и RedBeenPHP для работы с БД. Написал условия для регистрации и авторизации.
    Идея такая: если есть сессия у пользователя тогда даю ему доступ к папке auth если пользователь гость тогда доступ к папке guest
    PHP:
    1. if ( file_exists('all/'.$page.'.php') ) include 'all/'.$page.'.php';
    2.  
    3. else if ( $_SESSION['id'] and file_exists('auth/'.$page.'.php') ) include 'auth/'.$page.'.php';
    4.  
    5. else if ( !$_SESSION['id'] and file_exists('guest/'.$page.'.php') ) include 'guest/'.$page.'.php';
    6.  
    7. else not_found();
    При авторизации использую 2 функции на корректный емайл и пароль, а так же проверяю есть ли в базе данных указанный логин и пароль
    PHP:
    1. if ($_POST['login_f'])
    2. {
    3.  
    4.     email_valid();
    5.     password_valid();
    6.  
    7.    if ($user = R::count('users', "email = ?", array( $_POST['email'] )) < 1 )
    8.     message('Аккаунт с таким E-mail адресом не найден ');
    9.  
    10.    if ($user = R::count('users', "password = ?", array( $_POST['password'] ) ) < 1 )
    11.     message('Не правильно введен пароль ');
    12.  
    13. $_SESSION['id'] = array(
    14.          'type' => 'login',
    15.          'email' => $_POST['email'],
    16.          'name' => $_POST['name'],
    17.          'password' => $_POST['password'],
    18.          );
    19.      
    20.  
    21.  
    22.  
    23.     go('profile');
    24.   }
    но при попытки вывести данные с сессии ничего не происходит(сессия должна работать так как получен доступ к папке auth и сработал редирект на страницу /profile )
    PHP:
    1. <h1>Привет!</h1> <?=$SESSION['email']?>
    выходить только Привет
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    подчеркивание пропустил
     
  3. ALOE

    ALOE Новичок

    С нами с:
    17 дек 2017
    Сообщения:
    9
    Симпатии:
    0
    PHP:
    1. <h1>Привет!</h1> <?=$_SESSION['email']?>
    исправил, все равно не работает
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    стартовать сессию не забыл?
     
  5. ALOE

    ALOE Новичок

    С нами с:
    17 дек 2017
    Сообщения:
    9
    Симпатии:
    0
    PHP:
    1.  
    2.  
    3.  
    4. if ( file_exists('all/'.$page.'.php') ) include 'all/'.$page.'.php';
    5.  
    6. else if ( $_SESSION['id'] and file_exists('auth/'.$page.'.php') ) include 'auth/'.$page.'.php';
    7.  
    8. else if ( !$_SESSION['id'] and file_exists('guest/'.$page.'.php') ) include 'guest/'.$page.'.php';
    9.  
    10. else not_found();
    Стартовал, сессия есть потому как открылась папка для auth и закрылся доступ к папке guest
    Но вызвать я ее не могу :(
     
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @ALOE
    Обязательно лучше проверять переменные через функцию isset() и empty()
    Сделай примерно так:

    PHP:
    1. // Весь код ниже можно было и уменьшить на много меньше сделать!!!
    2.  
    3. # если в сессии нет id перенаправляем его сразу на вход или показываем нужную страницу
    4. # если сессия обнаружилась поехала вторая проверка файла, если файла нет редирект на нужную страницу
    5. if ( !isset($_SESSION['id']) )
    6. {
    7.     if(file_exists('guest/'.$page.'.php'))
    8.     {
    9.         //include 'guest/'.$page.'.php';
    10.         header('Location: /login.php/');
    11.         exit();
    12.     }
    13.     //include 'guest/'.$page.'.php';
    14.     header('Location: /login.php/');
    15.     exit();
    16. }
    17.  
    18. # если в сессии есть id  и такой файл существует перенаправляем пользователя куда надо или показываем нужную страницу
    19. if ( isset($_SESSION['id']) )
    20. {
    21.     if( file_exists('auth/'.$page.'.php') )
    22.     {
    23.       //include 'auth/'.$page.'.php';
    24.       header("Location: /cabinet.php/");
    25.       exit();
    26.     }
    27. }
    28.  
    29. if ( file_exists('all/'.$page.'.php') )
    30. {
    31.     //include 'all/'.$page.'.php';
    32.     header('Location: /редиректим куда надо или показываем свой контент который нужно например: include 'all/'.$page.'.php';/');
    33.     exit();
    34. } else { else not_found(); }
     
  7. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.854
    Симпатии:
    748
    Адрес:
    Татарстан
    так ты используешь целый массив в качестве id

    вот и выводи так же
    Код (Text):
    1. <h1>Привет!</h1> <?=$_SESSION['id']['email']?>
    и почитай книжек )))
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Это что за фигня? Т.е. если ввести свой e-mail и чужой (случайно) пароль, вход всё равно произойдёт
    PHP:
    1. $user = R::findOne("users", "email=?", [$_POST["email"]]);
    2. if (!$user) {
    3.     message('Аккаунт с таким E-mail адресом не найден ');
    4. }
    5. if ($user->password !== $_POST["password"]) {
    6.    message('Не правильно введен пароль ');
    7. }
    А вообще, в базе не хранят пароль в открытом виде. Надо использовать функции php для работы с паролями. password_hash, password_verify и т.п.
     
  9. ALOE

    ALOE Новичок

    С нами с:
    17 дек 2017
    Сообщения:
    9
    Симпатии:
    0
    Рабочий вариант, спасибо.
    PHP:
    1.     $_SESSION['id'] = array(
    2.          'type' => 'login',
    3.          'email' => $_POST['email'],
    4. );
    5.  
    6.     go('profile');
    Это значит что в сессию я записываю только email.
    но хочется записать непосредственно непосредственно id пользователя.

    Я шифровал в md5, проверка корректно работает при входе(на удивление):rolleyes:
     
  10. ALOE

    ALOE Новичок

    С нами с:
    17 дек 2017
    Сообщения:
    9
    Симпатии:
    0
    PHP:
    1. if ($user = R::count('users', "password = ?", array( $_POST['password'] ) ) < 1 )
    2. message('Не правильно введен пароль ');
    Действительно бред(исправлю):)
    спасибо
     
  11. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Это для тебя проблема? Перечитай руководство по твоей ORM.
     
  12. ALOE

    ALOE Новичок

    С нами с:
    17 дек 2017
    Сообщения:
    9
    Симпатии:
    0
    Читаю, но что-то у меня не получается понять, может синтаксис написания не правильный.
    Использую
    R::$adapter->getAssoc('select id,title from page');
    и foreach
    не работает :(
     
  13. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Что в таблице users? Если там есть id, то всё очень просто:
    PHP:
    1. $user= R::findOne("users","email=?",[$_POST["email"]]);
    2. echo $user->id;
    Если конечно такой пользователь существует.
    --- Добавлено ---
    Вот почему перед ORM надо научиться пользоваться просто php и MySQL
     
    Sergey_Tsarev нравится это.
  14. ALOE

    ALOE Новичок

    С нами с:
    17 дек 2017
    Сообщения:
    9
    Симпатии:
    0
    @mkramer
    Спасибо.

    Есть у меня еще вопроc:
    Лучше при авторизации засовывать в сессию все данные с таблицы или только емейл ?
     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Я обычно засовываю только id, по нему получить пользователя из базы очень быстро.
     
  16. ALOE

    ALOE Новичок

    С нами с:
    17 дек 2017
    Сообщения:
    9
    Симпатии:
    0
    Спасибо всем за помощь:)