【问题标题】:Codeigniter 3 get a specific session data by idCodeigniter 3 通过 id 获取特定会话数据
【发布时间】:2015-12-21 12:04:29
【问题描述】:

Codeigniter 3 会话表如下所示

CREATE TABLE IF NOT EXISTS `ci_sessions` (
    `id` varchar(40) 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->session

但是,如果我想访问特定的会话,我会怎么做。

我可以像这样获得会话

    $this->db->where('id', 'db256c0b82f8b6ba1e857d807ea613792817157a');
    $res = $this->db->get('ci_sessions');
    echo $res->row()->data;

我得到以下内容

    __ci_last_regenerate|i:1450694483;email|s:18:"amzadfof@gmail.com";user_code|s:7:"AAA1787";loginInId|i:8;users_id|s:11:"00000000002";active|s:1:"1";username|s:13:"amzadmojumder";fname|s:5:"Amzad";lname|s:8:"Mojumder";phone|s:11:"07900642131";title|s:1:"#";created_on|s:19:"2015-12-17 16:31:56";last_login|s:19:"0000-00-00 00:00:00";in_group|s:15:"2,1,3,4,5,6,7,8";

如何将其转换为 php 对象或数组?我试过了

 unserialize($res->row()->data);

也试过了

session_decode($res->row()->data);

这些都不起作用。任何帮助将不胜感激。

【问题讨论】:

  • 我认为你需要编辑 session.php 来填充你的会话。
  • 你最初是如何将数据放入表中的?

标签: codeigniter-3


【解决方案1】:

老问题,是的,但这对我有用。

https://github.com/wikimedia/php-session-serializer

从数据库中获取会话数据后,我只是这样做了

$array = PhpSessionSerializer::decode($session);

【讨论】:

    【解决方案2】:

    首先,CodeIgniter 会话表应该看起来更像这样:

    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.php 以确保正确设置以下内容,以便 CI 会话使用表进行存储

    $config['sess_use_database'] = TRUE;
    $config['sess_table_name'] = 'ci_sessions';
    

    您将面临的另一个问题是您并没有真正按照应有的方式使用会话。如果您想通过管理员开关或类似的方式模拟另一个人的会话,您最好创建一个新会话并复制表中的信息。如果您实际承担该会话,则您可能会在另一个用户访问它时破坏它或让它过期。所以我会编写自己的解析函数来复制数据库中的特定会话,如下所示:

    您的会话数据在您的 dB 中是这样分解的:

    __ci_last_regenerate|i:1450694483;
    email|s:18:"amzadfof@gmail.com";
    user_code|s:7:"AAA1787";
    loginInId|i:8;
    users_id|s:11:"00000000002";
    active|s:1:"1";
    username|s:13:"amzadmojumder";
    fname|s:5:"Amzad";
    lname|s:8:"Mojumder";
    phone|s:11:"07900642131";
    title|s:1:"#";
    created_on|s:19:"2015-12-17 16:31:56";
    last_login|s:19:"0000-00-00 00:00:00";
    in_group|s:15:"2,1,3,4,5,6,7,8";
    

    基本架构如下:

    {session_key}|{information type s=string, i=int}:{length}:"{value}";
    

    所以我们可以从数据库中抓取并解析

    <?php
    
    duplicateSession( $id_to_duplicate ) {
        // Kill any current sessions we're in to prevent conflicts
        $this->session->sess_destroy();
    
        // Get the Session we want to duplicate
        $this->db->where( 'id', $id_to_duplicate );
        $session = $this->db->get( 'ci_sessions' );
        $data = $session->row()->data;
    
        // Turn our data into an array so we can parse through it
        $data_arr = explode( ';', $data );
    
        // Loop through each of our items to parse it out
        foreach( $data_arr as $session_key ) {
            // Explode out to separate our key name from our values
            $session_key_arr = explode( '|', $session_key );
            $key_index = $session_key_arr[0];
    
            // Explode out to parse our values
            $session_value_arr = explode( ':', $session_key_arr[1] );
            $key_value = $session_value_arr[2];
    
            // Build our new session index
            $this->session->set_userdata( $key_index, $key_value );
        }     
    }
    
    ?>
    

    【讨论】:

    • 此解决方案适用于 codeigniter 2。问题是 codeigniter 3。无论如何感谢您的帮助。
    • dB 的解析应该仍然适合您,因为它是程序 PHP。
    【解决方案3】:

    我已经通过创建帮助函数来从现有会话 ID 更新会话来解决这个问题。

    参考:https://forum.codeigniter.com/thread-61330-post-322814.html#pid322814

    function updateSession( $session_id='' ) {
            $ci =& get_instance();
            // Kill any current sessions we're in to prevent conflicts
            $ci->session->sess_destroy();
            // Get the Session we want to duplicate
            $ci->db->where( 'id', $session_id );
            $session = $ci->db->get( 'ci_sessions' );
            $row = $session->row();
            if($row){
                $session_db_data = $row->data;
                $session_data = array();  // array where you put your "BLOB" resolved data
                $offset = 0;
                while ($offset < strlen($session_db_data)) 
                {
                    if (!strstr(substr($session_db_data, $offset), "|")) 
                    {
                        throw new Exception("invalid data, remaining: " . substr($session_db_data, $offset));
                    }
                    $pos = strpos($session_db_data, "|", $offset);
                    $num = $pos - $offset;
                    $varname = substr($session_db_data, $offset, $num);
                    $offset += $num + 1;
                    $data = unserialize(substr($session_db_data, $offset));
                    $session_data[$varname] = $data;  
                    $offset += strlen(serialize($data));
                }
                $ci->session->set_userdata($session_data);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2014-07-24
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-01-18
      • 2014-08-21
      • 2017-04-13
      • 2019-09-12
      相关资源
      最近更新 更多