За последние 24 часа нас посетили 62547 программистов и 1606 роботов. Сейчас ищут 960 программистов ...

Непонятки со Smarty

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

  1. Dilon

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

    С нами с:
    4 май 2014
    Сообщения:
    119
    Симпатии:
    4
    Адрес:
    соседний двор
    Есть такой код в шаблоне
    PHP:
    1. {* Шаблон главной страницы *}
    2.  
    3. {if isset($user)}
    4.     <p><a href="/product/">Перейдите пожалуйста по ссылке -></a></p>
    5. {else}
    6.     <h3>Для входа в систему авторизуйтесь.</h3>
    7. {/if}
    Когда проходит авторизация (здесь все нормально), висит все тот же "Для входа в систему авторизуйтесь.", и только когда перезагружаешь страницу второй раз, показывается корректный вариант из условия.

    В чем может быть загвоздка?
     
    #1 Dilon, 20 апр 2017
    Последнее редактирование модератором: 20 апр 2017
  2. Sergey_Tsarev

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

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Где у тебя определяется переменная $user?
     
  3. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    вангую танцы от куки, которая на этой странице устанавливается, но ещё не прислана. а так делать не надо. надо от сессии танцевать. сессия это хорошо.
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    После того, как прошла аутентификация (чтоб нас @Fell-x27 не ругал:) ), надо делать редирект, а не выводить какой-то шаблон. Можно даже редирект самого на себя, но обязательно редирект. Это касается любых форм, передающихся post
     
  5. Dilon

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

    С нами с:
    4 май 2014
    Сообщения:
    119
    Симпатии:
    4
    Адрес:
    соседний двор
    Ну само собой понятное дело. Я с сессией никак не подружусь. Ходит где-то, чую рядом где то.

    Во фронт контроллере, то есть index.php

    PHP:
    1. // если в сессии есть данные об авторизованном пользователе, то передаем
    2. // их в шаблон
    3. if (isset($_SESSION['user'])) {
    4.     $smarty->assign('user', $_SESSION['user']);
    5. }
    --- Добавлено ---
    А куда его, это редирект ставить? В контроллер? В модель?
     
    #5 Dilon, 20 апр 2017
    Последнее редактирование модератором: 20 апр 2017
  6. Dilon

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

    С нами с:
    4 май 2014
    Сообщения:
    119
    Симпатии:
    4
    Адрес:
    соседний двор
    Кажись я здорово туплю.
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Конечно, в контроллере самое место. Это же тоже взаимодействие с клиентом
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Что с ней не понятно? Задавай вопросы, не мучай себя.
     
  9. Dilon

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

    С нами с:
    4 май 2014
    Сообщения:
    119
    Симпатии:
    4
    Адрес:
    соседний двор
    Вот например в таблице пользователей есть пользователь, и конечно у него есть идентификатор. Как нужно сверять сессию устанавливаемую браузером, с идентификатором пользователя. Я вот это никак не могу понять.
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Браузер не устанавливает сессию, сессию открывает php, создаёт её идентификатор, файл, соответствующий этому идентификатору в служебной папке (можно настраивать), и пишет в куку идентификатор сессии. Потом эта кука приходит, php находит файлик и загружает его содержимое в $_SESSION, а перед завершением работы скрипта - выгружает содержимое $_SESSION обратно в файлик. Таким образом, тебе остаётся только стартануть сессию и записать туда user_id, об остальном позаботится сам php
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Этот каталог по умолчанию /tmp. Просто как дополнение к ответу. И тут надо быть внимательным. На ряде debian-based дистрибутивов каталог /tmp автоматически чистится по расписанию операционкой. Выпиливая, в том числе и сессии. Тонкости, увы, не помню, но, вроде как чистятся только файлики старше какого-то интервала. В любом случае, это надо учитывать. Особенно любителям делать сессии, не умирающие месяцами.
     
  12. Dilon

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

    С нами с:
    4 май 2014
    Сообщения:
    119
    Симпатии:
    4
    Адрес:
    соседний двор
    Я понял, моя ошибка в том что я хотел разобраться вот в этом

     
  13. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не особо-то он сам заботится, как оказалось, да? :D
     
    Dilon нравится это.
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Это просто сериализация массива с сохранением в файл. И десериализация обратно, где идентификатор куки - имя файла. Механизм простой как пробка. Можно даже собственный реализовать, но не нужно. По крайней мере пока.
     
  15. Dilon

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

    С нами с:
    4 май 2014
    Сообщения:
    119
    Симпатии:
    4
    Адрес:
    соседний двор
    Значит, приходит неизвестный пользователь, сервер создает сессию (запоминает его), потом этот пользователь вводит логин и пароль и нажимает войти. Сервер смотрит и обновляет уже существующую сессию. Так?
    Но я не могу понять вот это $_SESSION['user'] , вот в месте где user можно написать любое слово?
    --- Добавлено ---
    Как сессия определяет логин пользователя. Туплю, никак не могу понять.
     
  16. Dilon

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

    С нами с:
    4 май 2014
    Сообщения:
    119
    Симпатии:
    4
    Адрес:
    соседний двор
    Сессия что, запоминает пользователя вот так?
    ...
    'id' => '45',
    'username' => 'Чувак',
    'password' => ' здесь типа md5(длинная-длинная строка)',
    ...

    или не так?
     
  17. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Пишешь в сессию обычно id пользователя, потом проверяешь - если он туда записан, значит пользователь прошёл аутентификацию, и считываешь из базы его данные. В принципе, можно и все данные туда записать, но это хуже, к примеру, ты не сможешь сделать принудительное разлогирование. Потом, когда пользователя надо разлогинить, просто удаляешь его id из сессии, и радуешься. Сессия - это просто хранилище данных между вызовами скриптов, чего туда пихать и зачем, и что делать с тем, что ты туда запихал, определяешь ты сам.
     
  18. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Совершенно любое. Это просто ключ в массиве. Ты его сам определяешь. Хоть user, хоть motherfucker. Это просто ключ массива.
    --- Добавлено ---
    Никак. Ты сначала логин пишешь в сессию с тем ключом, который захотел, потом читаешь его из массива по этому же ключу. Я вот логин храню под ключом login, а не user, к примеру. Сессии плевать, что ты у нее спрашиваешь. Механизм не знает ничего о логинах, паролях, он туп как пробка. Он умеет только сохранять массив на винт и читать его оттуда. Что в этом массиве хранится и какой смысл имеет - это только от тебя зависит.
    --- Добавлено ---
    То есть нет никакой "сессии, хранящей пользователя". Есть сессия, которая хранит то, что ты счел нужным хранить в ней. Хэш от пароля, к примеру, я не знаю зачем тебе в ней хранить. Где он тебе пригодится? Для аутентификации? Дык просто в сессии храни флаг, что $_SESSION['logged_on'] = true; и проверяй его наличие. Зачем лезть в БД на каждый чих, сверяя хэш пароля, который был введен единожды и не будет меняться до конца сессии, так как выставляется только при входе на сайт? Просто выставляй проверку залогиненности.