为什么呼叫会话不起作用? (codeigniter 3)

时间:2016-05-26 10:39:21

标签: php mysql codeigniter session 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 )中调用会话俱乐部时,它正在工作

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

解决我问题的任何解决方案?

谢谢

6 个答案:

答案 0 :(得分:5)

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

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

作者:

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

答案 1 :(得分:2)

@Ali建议的答案会在 <LinearLayout android:id="@+id/llcontainer" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="@dimen/half_keyline" android:orientation="horizontal"> <RadioButton android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="text1"/> </LinearLayout> 的构造函数中工作或加载会话库,如此......

Dashboard.php

或者,如果您只需要在控制器内的一个特定功能中进行会话,请在该功能中加载库。

关键是必须先将库加载到某个地方才能调用其函数。

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

答案 2 :(得分:1)

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

然后一切都好!

答案 3 :(得分:0)

您需要使用application/config/autoload.php

默认加载会话库

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

答案 4 :(得分:0)

我下载了最新版本的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;

之后,您就在自动加载文件中了 应用/配置/ 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 /控制器/ Example2.php

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

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

应用/视图/示例/ 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>

希望这可以帮助您调试会话库,如果您遇到更多问题,请查看我在视图中制作的每个回显中的结果

答案 5 :(得分:0)

默认情况下,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 <----
[...]