为什么呼叫会话不起作用? (代码点火器 3)

Why call session not working? (codeigniter 3)

我的配置是这样的:

$config['sess_driver'] = 'database';  // select database driver
$config['sess_save_path'] = 'ci_sessions';  // name of the mysql table
$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = TRUE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = FALSE;
$config['sess_time_to_update']  = 300;

我的自动加载是这样的:

$autoload['libraries'] = array('database', 'session', 'form_validation', 'functions');

在控制器中 login.php :

$this->session->set_userdata('club', 'chelsea');

在控制器中 dashboard.php :

echo $this->session->userdata('club');

不同控制器调用会话俱乐部失败

但是,当我在同一个控制器(控制器 login.php)中调用会话俱乐部时,它正在工作

我在 Dashboard.php 的构造函数中尝试 $this->library->load('session');。但是没有成功

有什么方法可以解决我的问题吗?

谢谢

默认使用application/config/autoload.php

加载session库

https://www.codeigniter.com/user_guide/libraries/sessions.html

@Ali 的回答建议将在 Dashboard.php 的构造函数中工作或加载会话库,就像这样...

class Dashboard extends CI_Controller
{
  public function __construct()
  {
    parent::__construct();
    $this->load->library('session');
  }

  //the rest of controller's code
}

或者,如果您只需要在控制器内的一个特定功能中使用会话,则改为在该功能中加载库。

重点是必须先将库加载到某个地方,然后才能调用它的函数。

在控制器中选择自动加载还是显式加载会话可能取决于您的站点需要使用会话的频率。如果每个控制器都使用它们,则选择自动加载。如果只有少数几个地方需要会话,那么将它们加载到不使用它们的地方是一种资源浪费。

我下载了最新版本的 CI 3.0.6,当我比较路径 application/config/config.php 中的会话部分时,你有

$config['sess_driver']          = 'database';  // select database driver
$config['sess_save_path']       = 'ci_sessions';  // name of the mysql table
$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = TRUE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = FALSE;
$config['sess_time_to_update']  = 300;

并且原始文件有(包含您的信息)

$config['sess_driver']             = 'database';
$config['sess_cookie_name']        = 'ci_session';
$config['sess_expiration']         = 7200;
$config['sess_save_path']          = 'ci_session';
$config['sess_match_ip']           = FALSE;
$config['sess_time_to_update']     = 300;
$config['sess_regenerate_destroy'] = FALSE;

之后你就在自动加载文件中 application/config/autoload.php

$autoload['libraries'] = array('database', 'session', 'form_validation', 'functions');

然后在一个控制器中做这个

class Example extends CI_Controlelr{
    public function __construct(){
        parent::__construct();
    }

    public function index(){
        if( $this->session->has_userdata('test_name')){
            $this->session->set_flashdata('exist_userdata', 'The session was seted before');

            redirect(base_url('index.php/example2'), 'refresh');
        }
        else{
            $newdata = array(
                                'test_name' => 'name',
                                'test_id'   => 12
                            );

            $this->session->set_userdata($newdata);

            $this->session->set_flashdata('set_userdata_ok', 'You set your user data');

            redirect(base_url('index.php/example2'), 'refresh');
        }
    }
}

applicationi/controller/Example2.php

class Example2 extends CI_Controller{
    public function __construct(){
        parent::__construct();
    }

    public function index(){
        $this->load->view('example/index');
    }
}

application/views/example/index.php

<div>
    <?php
        if( isset( $this->session->flashdata('set_userdata_ok'))){
            echo $this->session->flashdata('set_userdata_ok');
        }
        if( isset( $this->session->flashdata(exist_userdata))){
            echo $this->session->flashdata('exist_userdata');
        }
    ?>
</div>
<br>
<div>
    <?php
        echo "printing general";
        var_dump($_SESSION);
        echo "<hr>";
        var_dump($this->session->userdata());
        echo "<hr><hr>";
        echo "printing spesific data";
        echo $_SESSION['test_name'];
        echo $this->session->test_name;
        echo "<hr>";
        echo $this->session->userdata('test_name');
    ?>
</div>

希望这可以帮助您调试会话库,如果您还有更多问题,请将结果发送到视图中的每个回显中

对于工作会话,在配置文件中设置加密密钥很重要。您可以将任何关键字设置为加密密钥。使用困难的字符串可以提高会话安全性。下面给出一个例子 $config['encryption_key'] = '4n9*^%%$3n^&4v&%7@!90&$$3c3x$^*$m8a456#@tgf%$$c';

默认情况下,codeigniter 3 使用文件驱动程序,因此您应该创建如下目录:

mkdir /<path to your application directory>/sessions/
chmod 0700 /<path to your application directory>/sessions/
chown www-data /<path to your application directory>/sessions/

Codeigniter info

之前,您应该更新 config.php 路径目录:

$config['sess_save_path'] = 'sessions';

奖励:如果你使用的是 macOSX,你应该看看你的 apache 用户是什么:

$ cat /etc/apache2/httpd.conf
[...]
User _www <-----
Group _www <----
[...]

我遇到了同样的问题,然后我检查了Session.php中的代码,发现:

if (isset($_COOKIE[$this->_config['cookie_name']])
        && (
            !is_string($_COOKIE[$this->_config['cookie_name']])
            OR !preg_match('/^[0-9a-f]{40}$/', $_COOKIE[$this->_config['cookie_name']]))
){
    unset($_COOKIE[$this->_config['cookie_name']]);
} 

但是 cookie 的长度只有 32,所以 'ci' 每次都创建一个新的 cookie。

我改

  OR !preg_match('/^[0-9a-f]{40}$/', $_COOKIE[$this->_config['cookie_name']])

  OR !preg_match('/^[0-9a-f]{32}$/', $_COOKIE[$this->_config['cookie_name']])

那一切就OK了!

在 CodeIgniter 3.x 中,如果您刚刚升级到 PHP 版本 7.x,请转到 system/libraries/Session/session.php 第 281 行并替换:

ini_set('session.name', $params['cookie_name']); 

作者:

ini_set('session.id', $params['cookie_name']);