Intereting Posts
Функция MySQL STR_TO_DATE не работает во времени загрузить файл изображения из данной диаграммы Google api url, используя php Как искать объект, привязанный к объекту, в моем поиске в Doctrine? Zend Regex Route> Отслеживать версию api Почему PHP-файлы не используются для (пользовательских) CSS и JS? Пользовательский интерфейс jQuery Sortable с Laravel не отправит не удается получить сообщения чата Регулярное выражение в preg_replace для определения формата url и элементов выделения Keep & nbsp; и другие специальные символы в выходе XSLT с применением шаблонов поиск нескольких ключевых слов с php и mysql (где X нравится) Предупреждение: невозможно изменить информацию заголовка – заголовки, уже отправленные Создание базовых веб-сервисов в php Соглашения о присвоении имен при использовании codeigniter в windows и linux Получить Учение или пройти службу без использования __construct – Symfony2 Почему PHP назначает контекст вызову статического метода и не дает уведомления E_STRICT?

Уничтожьте сеанс, но сохраните flashdata

Я использую Tank Auth для управления пользователями в своем приложении CI 1.7.3. Все работает нормально, но я пытаюсь установить flash_message для отображения, когда пользователь выходит из системы. Проблема заключается в $this->tank_auth->logout(); функция разрушает сеанс. Я изменил функцию выхода в библиотеке Tank Auth, чтобы выглядеть так:

  function logout() { $this->delete_autologin(); // See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line $user_session_data = array('user_id' => '', 'username' => '', 'status' => ''); $this->ci->session->set_userdata($user_session_data); $this->ci->session->unset_userdata($user_session_data); } 

Это было ранее

 function logout() { $this->delete_autologin(); // See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line $this->ci->session->set_userdata(array('user_id' => '', 'username' => '', 'status' => '')); $this->ci->session->sess_destroy(); } 

В моем контроллере у меня есть

 function logout(){ if ($this->tank_auth->is_logged_in()) { // logged in $this->session->set_flashdata('status_message', $this->lang->line('auth_message_logged_out')); $this->tank_auth->logout(); redirect(''); } из function logout(){ if ($this->tank_auth->is_logged_in()) { // logged in $this->session->set_flashdata('status_message', $this->lang->line('auth_message_logged_out')); $this->tank_auth->logout(); redirect(''); } 

}

Если я удалю $this->tank_auth->logout(); функция сообщение показывает штраф. Я уверен, что это простая проблема с сеансом

    Если вы попытаетесь установить flashdata при использовании базы данных в том же запросе после вызова sess_destroy() , это не сработает (потому что нет сеанса для добавления flashdata).

    Чтобы устранить эту проблему, добавьте $this->ci->session->sess_create(); после вызова sess_destroy() . Это работает, потому что вы воссоздаете сеанс перед попыткой добавить к нему данные. Это единственный способ использовать flashdata после sess_destroy() если вы используете сеансы в базе данных.

    Функция sess_destroy() уничтожает также флэш-переменные сеанса, используемые для передачи сообщения.

    U уже ответил на ваш вопрос, в функции logout() библиотеки вам нужно заменить

     $this->ci->session->sess_destroy(); 

    с

     $this->ci->session->unset_userdata(array('user_id' => '', 'username' => '', 'status' => '')); 

    Это не полностью уничтожит сеанс, только пользовательские данные, используемые для входа в систему, поэтому я рекомендую вместо этого изменить функцию logout() в контроллере и показать сообщение вручную, передав его в представление.

    Хотя это обходной путь, это может сделать трюк для вас …

    везде, где вы их показываете, я буду считать, что вы проверяете представление так …

     <? if ($this->session->flashdata('status_messege'): ?> <p><?= $this->session->flashdata('status_message') ?></p> <? endif; ?> 

    вы МОЖЕТЕ добавить elseif к этому и проверить, что реферер является вашей функцией выхода …

     <? if ($this->session->flashdata('status_messege'): ?> <p><?= $this->session->flashdata('status_message') ?></p> <? else if ($this->agent->referrer() == site_url('path/to/logout'): ?> <p><?= $this->lang->line('auth_message_logged_out') ?></p> <? endif; ?> 

    Немного хакерский способ преодолеть эту проблему, но, вероятно, тем не менее.