如何在codeigniter 3.1会话数据库表

时间:2017-05-15 18:42:40

标签: php mysql database codeigniter session

我正在使用codeigniter 3.1,我希望用会话中的用户名和用户ID跟踪用户并将其存储到数据库表中。所以我在数据库中创建了codeigniter 3.1会话表。这是

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

此外还更改了config.php个会话

    $config['sess_driver'] = 'database';
    $config['sess_cookie_name'] = 'ci_sessions';
    $config['sess_expiration'] = 7200;
    $config['sess_save_path'] = 'ci_sessions';//its your table name name
    $config['sess_match_ip'] = FALSE;
    $config['sess_time_to_update'] = 300;

这是我的会话控制器功能

        public function session_test($value='')
        {
            $newdata = array(
                       'username'  => 'johndoe',
                       'user_id'     => 3,
                       'logged_in' => TRUE
                   );

    $this->session->set_userdata("userdata",$newdata);
    $session_id = $this->session->userdata('userdata');
    echo "<pre>";
    print_r($session_id);
    echo "</pre>";
        }

此处输出显示在浏览器中

    Array
    (
        [username] => johndoeasdas
        [user_id] => johndasdasoe@some-site.com
        [logged_in] => 1
    )

并存储在数据库中这是作为数据库中存储的会话的图像

database

此处我无法将会话中的用户名和user_id存储到数据库中。

如何将session和user_id从session存储到数据库表中。

感谢所有建议。

2 个答案:

答案 0 :(得分:2)

CREATE TABLE IF NOT EXISTS  `ci_sessions` (
session_id varchar(40) DEFAULT '0' NOT NULL,
ip_address varchar(45) DEFAULT '0' NOT NULL,
user_agent varchar(120) NOT NULL,
last_activity int(10) unsigned DEFAULT 0 NOT NULL,
user_data text NOT NULL,
PRIMARY KEY (session_id),
KEY `last_activity_idx` (`last_activity`)
);

此表将存储您的会话数据。现在我们需要设置config变量。转到“application / config / config.php”并更新以下变量:

$config['sess_driver'] = 'database'; //by deafault it may be 'files'
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

现在使用

存储会话数据
$data = array(
    'name'         => 'xyz', //some value
    'is_logged_in' => TRUE
  );
  $this->session->set_userdata($data);

有关详细信息,请访问https://www.codeigniter.com/userguide3/libraries/sessions.html

答案 1 :(得分:0)

您不需要更改ci_session的结构,实际上您不应该更改表结构。使用CodeIgniter's documentation中的表格结构。

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`)
);

您添加到会话数据的任何内容都将存储在&#34;数据&#34;表的一栏。

会话数据已经是一个数组。通过将一组数据作为会话数据项,您只会让生活变得更加艰难。此测试控制器可以更轻松地访问任何给定的会话数据项。

public function session_test($value = '')
{
    $newdata = array(
      'username' => 'johndoe',
      'user_id' => 3,
      'logged_in' => TRUE
    );

    $this->session->set_userdata($newdata);
    echo "User Name: ".$this->session->username."<br>";
    echo "User ID: ".$this->session->user_id."<br>";
    echo "Is logged in: ";
    echo $this->session->logged_in ? 'Yes' : 'No';
}