【问题标题】:Why call session not working? (codeigniter 3)为什么通话会话不起作用? (代码点火器 3)
【发布时间】:2016-09-24 07:33:51
【问题描述】:

我的配置是这样的:

$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');。但这并不成功

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

谢谢

【问题讨论】:

  • 您是否在 autoload.php 文件中加载了会话??
  • @Mohit Jain,是的,我在 autoload.php 文件中加载会话。但它不起作用
  • 在仪表板中var_dump($this->session->userdata('club')) 时是否收到任何错误???我在您的配置中没有看到 $config['sess_driver'] 参数
  • @RejoanulAlam,结果:NULL。我添加了$config['sess_driver']

标签: php mysql codeigniter session codeigniter-3


【解决方案1】:

你需要默认使用application/config/autoload.php加载会话库

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

【讨论】:

  • 我在 autoload.php 文件中有加载会话。但它不起作用
【解决方案2】:

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

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

  //the rest of controller's code
}

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

关键是必须先在某个地方加载该库,然后才能调用它的函数。

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

【讨论】:

  • 我在 autuload 中尝试$autoload['libraries'] = array('database', 'session', 'form_validation', 'functions');,在Dashboard.php 的构造函数中尝试$this->library->load('session');。它不工作
  • 可能是cookie设置问题?编辑您的问题并为 cookie_domain、cookie_path 和 cookie_secure 添加配置设置。
  • 谢谢。我像这样更改设置:$config['cookie_prefix'] = ""; $config['cookie_domain'] = ""; $config['cookie_path'] = "/"; $config['cookie_secure'] = FALSE;。它正在工作
  • 嘿@DFriend,有点晚了,但它是$this->load->library('session'),而不是您在代码中编写的方式。
【解决方案3】:

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

之后你就在自动加载文件中 应用程序/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');
    }
}

应用程序/视图/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>

希望这可以帮助您调试会话库,如果您有更多问题,请在我查看的每个 echo 中发送结果

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        然后一切正常!

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • 为什么这个解决方案有效?我不明白机制。没有触摸系统文件夹就没有解决办法吗?
          • 这对我有用,谢谢!
          猜你喜欢
          • 2012-11-01
          • 2016-12-26
          • 2015-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-29
          • 1970-01-01
          • 2017-12-12
          相关资源
          最近更新 更多