为什么调用会话不工作?(codeigniter 3)

ljsrvy3e  于 2023-01-15  发布在  其他
关注(0)|答案(7)|浏览(177)

我的配置是这样的:

$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)中调用session club时,它可以正常工作
我在Dashboard.php的构造函数中尝试了$this->library->load('session');,但是没有成功
有什么办法可以解决我的问题吗?
谢谢

nkoocmlb

nkoocmlb1#

在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']);
icomxhvb

icomxhvb2#

来自@Ali的答案建议将工作或加载Dashboard.php的构造函数中的会话库,如下所示...

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

  //the rest of controller's code
}

或者,如果您只需要控制器内一个特定函数中的会话,则加载该函数中的库。
关键在于,在调用库的函数之前,必须先将库加载到某个位置。
在控制器中选择自动加载或显式加载会话可能取决于您的站点需要使用会话的频率。如果每个控制器都使用它们,则选择自动加载。如果只有少数位置需要会话,则在不使用它们的位置加载它们是浪费资源。

rqenqsqc

rqenqsqc3#

我遇到了同样的问题,然后我检查了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']])

那就没事了!

vnjpjtjt

vnjpjtjt4#

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

p3rjfoxz

p3rjfoxz5#

默认情况下需要使用application/config/autoload.php加载会话库
https://www.codeigniter.com/user_guide/libraries/sessions.html

6l7fqoea

6l7fqoea6#

我下载了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>

希望这能帮助你调试会话库,如果你有更多的问题,发送的结果,在每一个回声我做的看法

dba5bblo

dba5bblo7#

默认情况下,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/

代码触发器信息
之前,你应该更新config.php的路径目录:

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

额外好处:如果你使用的是macOSX,你应该看看你的apache用户:

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

相关问题