【问题标题】:Codeigniter session was not stored in database when using database driver使用数据库驱动程序时,Codeigniter 会话未存储在数据库中
【发布时间】:2018-12-07 06:07:03
【问题描述】:

在实时服务器上使用数据库驱动程序时,Codeigniter 会话未存储在数据库中。但它在当地环境中运行良好。

Codeigniter 版本:3.1.9 PHP版本:7.2.11

在我的 codeigniter 配置下,

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 600;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 180;
$config['sess_regenerate_destroy'] = FALSE;

谁有想法,请指教。

【问题讨论】:

  • 好吧,很明显的提问时间...您是否更改了数据库设置以匹配实时服务器并且数据库存在以及所有类似的东西?
  • 我正在使用以下数据库配置,如果不存在则创建表 ci_sessions (id varchar(128) NOT NULL, ip_address varchar(45) NOT NULL, timestamp int( 10)无符号默认0 NOT NULL,data blob NOT NULL,KEY ci_sessions_timestamptimestamp));
  • 我在谈论 /application/config/database.php - 您是否检查了该文件中的数据库设置...尽管您认为它会创建连接错误消息。检查你的错误日志,什么不是......有些东西不像看起来......
  • 我没有看到任何错误日志。
  • @TimBrownlaw 数据库连接也很好。为什么我确定连接性,我可以使用我的应用程序将所有内容保存在数据库中。但是会话只是没有存储在我们的数据库中。我也尝试过手动输入的 ci_session 表,这也很好。但是我的调查发现,当我单击或刷新任何页面时,不会触发 Session_database_driver.php 文件。

标签: codeigniter codeigniter-3


【解决方案1】:

首先你必须改变配置以使用这样的数据库:

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

然后你必须为你的会话创建一个表,我已经为此创建了一个迁移文件:

class Migration_Create_ci_sessions extends CI_Migration
{    
    private $table;

    public function __construct()
    {
        parent::__construct();
        $this->load->dbforge();
        $this->table = 'ci_sessions';
    }

    public function up()
    {
        $this->dbforge->drop_table($this->table, TRUE);

        $ci_sessions = '`id` VARCHAR(128) NOT NULL,
        `ip_address` VARCHAR(45) NOT NULL,
        `timestamp` int(10) UNSIGNED DEFAULT 0 NOT NULL,
        `data` BLOB NOT NULL,
        KEY `ci_sessions_timestamp` (`timestamp`)';

        $this->dbforge->add_field($ci_sessions);
        unset($ci_sessions);

        $this->dbforge->create_table($this->table, TRUE);
    }

    public function down()
    {
        $this->dbforge->drop_table($this->table, TRUE);
    }
}

或者如果您愿意,可以直接使用 sql:

CREATE TABLE IF NOT EXISTS `ci_sessions` (
    `id` varchar(128) NOT NULL,
    `ip_address` varchar(45) NOT NULL,
    `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
    `data` blob NOT NULL,
    KEY `ci_sessions_timestamp` (`timestamp`)
);

当然你必须加载或自动加载你的数据库:

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

并正确设置数据库的配置:

'username' => 'username',
'password' => 'password',
'database' => 'database',

【讨论】:

  • 我已经将 config.php 文件配置为与您发送的相同。您能否确认我们需要设置一个与 sess_save_path 相同的 sess_cookie_name。
  • 不,它们不必是相同的名称,如果上述所有操作都正确,您能否确认与数据库的连接正常且功能正常?因为如果它不正常,那么肯定它是一个不同的问题!
  • 数据库连接也很好。为什么我确定连接性,我可以使用我的应用程序将所有内容保存在数据库中。但是会话只是没有存储在我们的数据库中。我也尝试过手动输入的 ci_session 表,这也很好。但是我的调查发现,当我单击或刷新任何页面时,不会触发 Session_database_driver.php 文件。
  • 您确定会话库已加载吗?你能确认一下吗?
  • 是的,它已加载。我在日志中验证了。 INFO ---> 已初始化数据库驱动程序类 INFO ---> 会话:使用“数据库”驱动程序初始化的类。
猜你喜欢
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 2014-03-10
  • 2011-10-29
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
相关资源
最近更新 更多