2012-02-14 6 views
1

Что не так в этом коде?CodeIgniter странное поведение с sess_destroy

Переменная сеанса «пользователь» имеет идентификатор зарегистрированного пользователя. Он установлен в процессе входа в систему.

$this->session->set_userdata("user",$user->id); 

Этот код всегда отображает страницу с ошибкой и выполняет сеанс destroy !!! why?

if (!$this->session->userdata("user")) 
{ 
    $error = "User do logout without been logged [" . $_SERVER['REMOTE_ADDR'] ."]" ; 
    log_message('error', $error); 
    show_error($error); 
} 
else 
{ 
    $this->session->sess_destroy(); 
} 

Если я комментирую $ this-> последнего сеанса> sess_destroy() это работает, сессия не уничтожить, а ошибка не показана

+0

Я обнаружил неожиданное поведение при попытке использовать библиотеку сеансов CI для онлайн-чата. Я, наконец, переключился на использование собственных PHP-сессий. Я подозреваю, что вы нашли такую ​​ошибку. Хороший улов; это может дать некоторую полезную информацию. –

ответ

1

Ваша функция говорит: «Если пользователь не войдите в систему, покажите сообщение об ошибке и запишите ошибку, в противном случае зарегистрируйте пользователя с помощью sess_destroy() "

Итак, если вы заходите на страницу и вы не вошли в систему, вы увидите ошибку. Если вы заходите на страницу и вы вошли в систему, функция вызывает sess_destroy и выводит вас на экран.


Разъяснение: Ваш код позволяет только для состояния 1 пользователя: логаут - это единственный способ будет любой выход на этой странице. Если кто-то, кто вошел в систему, посещает страницу, они немедленно выходят из системы.

if($this->session->userdata('email')){ 
    //the user is logged in 
    echo "HELLO USER, YOU ARE LOGGED IN!"; 
}else{ 
    //you don't need session_destroy because 
    //they won't get here with a session to be destroyed 
    redirect('/home'); 
} 

Дальнейшее уточнение: я испытал это на новую установку Codeigniter, и он ведет себя так, как я объяснил.

Изменение контроллера приветствия по умолчанию, чтобы сэкономить время:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Welcome extends CI_Controller { 

    function __construct() 
    { 
     parent::__construct(); 
     $this->load->library('session'); 

    } 

    function index() 
    { 

     $this->session->set_userdata("user","1234"); 
     echo "userdata set to: ".$this->session->userdata("user"). "<br>"; 
     echo "<a href='welcome/checksess'>check session</a>"; 
    } 

    function checksess() 
    { 


     if (!$this->session->userdata("user")) 
     { 
      $error = "User do logout without been logged [" . $_SERVER['REMOTE_ADDR'] ."]" ; 
      log_message('error', $error); 
      show_error($error); 
     } 
     else 
     { 
      echo "userdata: ".$this->session->userdata("user"). " about to be destroyed with sess_destroy<br>"; 
      $this->session->sess_destroy(); 
      echo "<a href='checksess'>check session again after sess_destroy (refresh this page)</a>"; 
     } 
    } 
} 

/* End of file welcome.php */ 
/* Location: ./application/controllers/welcome.php */ 

При посещении приветственного/индекса он устанавливает данные сессии. Когда вы нажимаете ссылку на checkess, checkess echo - это userdata, то вызывает sess_destroy. Теперь, если вы обновляете контрольные суммы, userdata НЕ установлен (из-за sess_destroy), и вы видите сообщение об ошибке «User do logout without logged ...»

В коде не содержится ничего, чтобы объяснить поведение, которое вы испытываете ,

+0

Нет, это было бы правильное поведение ... если я вошел в систему, и я нахожусь на странице, я получаю сообщение об ошибке и сеансе. это как выполнить страницу дважды. Я не знаю, почему, но это происходит ... – alasarr

+0

Нет, это не так. Я обновил ответ на примере ... но, не говоря уже о том, что ваш код позволяет только пользователю выйти из системы. – stormdrain

+0

Я знаю ... это очень странно, но это случается, я глубоко проверил тест. Мои шаги: 1) Вход 2) запуск страницы пользователя 3) выход 4) Я получаю журнал ошибок и сеанс уничтожен (я знаю, что сеанс уничтожен из-за того, что я вижу его на профилировщике CI, и я не вижу этого шага 2 – alasarr

Смежные вопросы