CodeIgniter странное поведение с sess_destroy - PullRequest
1 голос
/ 14 февраля 2012

Что не так в этом коде?

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

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

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

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-> session-> sess_destroy () работает, сессия не уничтожается и ошибка не отображается

1 Ответ

1 голос
/ 14 февраля 2012

Ваша функция говорит: «Если пользователь не вошел в систему, покажите сообщение об ошибке и зарегистрируйте ошибку, в противном случае выйдите из системы с помощью 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 */

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...