Как установить set_userdata после session_destroy в codeginiter? - PullRequest
0 голосов
/ 22 декабря 2018

По некоторым причинам мне нужно уничтожить все сеансы в контроллере в моем коде, и сразу после этого установить новый.но, как вы можете видеть в следующем примере, кажется, что он не работает в Codeigniter версии 3.1.9, или мое использование неправильно.

У меня есть этот контроллер в моем Codeigniter:

<?php
class Test extends CI_Controller {
    public function index()
    {
        $this->load->library('session');
        $this->session->sess_destroy();
        $session_data = array (
            'key_1' => 'value_1',
            'key_2' => 'value_2',
            'key_3' => 3
        );
        $this->session->set_userdata($session_data);
        $this->session->set_userdata('key_4', 4);
        print_r($_SESSION);
    }

    public function next()
    {
        $this->load->library('session');
        print_r($this->session->all_userdata());
    }
}

Когда я открываю MYDOMAIN.COM/test, вывод выглядит так:

Array ( [__ci_last_regenerate] => 1545508348 [key_1] => value_1 [key_2] => value_2 [key_3] => 3 [key_4] => 4 )

, но сразу после этого, если я открываю MYDOMAIN.COM/test/next, вывод будет пустым, как это:

Array ( [__ci_last_regenerate] => 1545509049 )

В config.php конфигурация сеанса похожа на приведенную ниже (обратите внимание, что ci_sessions является записываемой папкой):

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 60*60*1;
$config['sess_save_path'] = APPPATH . 'ci_sessions/';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

Не могли бы вы подсказать, что не так?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Использование:

$this->session->sess_regenerate(true);

Вместо:

$this->session->sess_destroy();
0 голосов
/ 23 декабря 2018

Подумайте на минуту, что вы делаете.Сначала вы просто начинаете сеанс, вызывая $this->load->library('session').Затем вы немедленно прекращаете сеанс с помощью $this->session->sess_destroy();.

. Есть несколько проблем с тем, что вы пытаетесь. Прочтите это , чтобы узнать больше.

Было бы гораздо лучше просто очистить $_SESSION и затем добавить в него новые данные.

public function index()
{
    $this->load->library('session');
    // if you want a new session id uncomment the next line, needs to happen before you clear $_SESSION
    //session_regenerate_id();
    $_SESSION = array();
    // if you uncommented earlier then uncomment the next too
    //$_SESSION['__ci_last_regenerate'] = time();
    $session_data = array (
        'key_1' => 'value_1',
        'key_2' => 'value_2',
        'key_3' => 3
    );
    $this->session->set_userdata($session_data);
    $this->session->set_userdata('key_4', 4);
    print_r($_SESSION);
}

С CodeIgniter> v3.0.0 вы можете установить $_SESSION напрямую.Документация фактически рекомендует делать это таким образом.Имея это в виду, строка

$this->session->set_userdata('key_4', 4);

может (должна) быть написана

$_SESSION['key_4'] = 4;

set_userdata() полезна для быстрой установки большого количества ключей / значений $_SESSION.

Тем не менее, следующее кажется мне менее абстрактным, чем предыдущий код.Если ничего другого, то он использует крошечный чуть меньше памяти и избегает вызова функций.

$_SESSION = array();
$_SESSION['key_1'] = 'value_1';
$_SESSION['key_2'] = 'value_2';
$_SESSION['key_3'] = 'value_3';
$_SESSION['key_4'] = 'value_4';
$_SESSION['__ci_last_regenerate'] = time();

Извините, иногда я не могу удержаться от перехода в режим лекции.

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