CodeIgniter:将最后一个活动存储到数据库中

Posted

技术标签:

【中文标题】CodeIgniter:将最后一个活动存储到数据库中【英文标题】:CodeIgniter: Store last activity into database 【发布时间】:2013-06-26 11:31:22 【问题描述】:

我在数据库中创建了两张表,一张是用户表,另一张是会话表。我认为将最后一个活动存储到会话中不会有任何问题,但后来我发现会话正在删除,我不知何故无法存储最后一个活动。因为我想将最后一个活动存储在某个地方,所以我需要一个解决方案,如何在大约五分钟内将其保存到用户表中 - 与 CodeIgniter 更改它的会话数据一样。

那么,该怎么做呢?

【问题讨论】:

在配置中开启db_session 我已经这样做了,因为所有会话数据都进入会话表。 你的目标是什么?我知道您想跟踪用户活动,但为什么呢?跟踪数据有什么用?你将如何使用它?你会保留多久?您已经谈到了您的实现,但是看到下面的所有 cmets,如果我们了解基本目标,我们似乎可以为您提供更多帮助。我之所以这么说是因为来自 Murch 的 cmets,我想知道您是否不是最好的方法。 @colonelclick:WesleyMurch 解决了我的问题,感谢您的提问。 【参考方案1】:

忘记会话表,只需在每次请求时更新用户表。我会在您的基本控制器的构造函数中执行此操作,以便它自动运行(如果您对此不熟悉,请参阅MY_Controller examples)。像这样的:

class MY_Controller extends CI_Controller 

    public function __construct()
    
        parent::__construct():
        // The session class is available now because
        // we called the parent constructor, where it is already loaded.

        // Get the current logged in user (however your app does it)
        $user_id = $this->session->userdata('user_id');

        // You might want to validate that the user exists here

        // If you only want to update in intervals, check the last_activity.
        // You may need to load the date helper, or simply use time() instead.
        $time_since = now() - $this->session->userdata('last_activity');
        $interval = 300;

        // Do nothing if last activity is recent
        if ($time_since < $interval) return;

        // Update database
        $updated = $this->db
              ->set('last_activity', now())
              ->where('id', $user_id)
              ->update('users');

        // Log errors if you please
        $updated or log_message('error', 'Failed to update last activity.');
    


要使用此基本控制器,您将使用其他控制器对其进行扩展。示例:

class SomeController extends MY_Controller 

    // MY_Controller constructor runs automatically

    function index()
    
        // your code
    


您也许可以在最初获取登录用户的相同位置执行此操作。

【讨论】:

如何在 5 分钟内检查 last_activity(以便我可以更新数据库)?这个控制器是否能够访问诸如会话和模型之类的核心库(或者最好像你一样在这个控制器内部创建 sql 查询)? @user1257255 将 last_activity(时间)放入会话变量中。然后检查每个请求与当前时间的时差。 last_activity 已经在核心库会话的变量中。我需要知道将 Wesley 的代码放在哪里,因为我有更多不同的控制器(用户可能不会打开主控制器,然后不会存储上一个活动),同时我需要检查值之前和现在的 last_activity (所以我可以在数据库中更改它)。我可以扩展库并将数据库信息直接放入其中吗?我可以使用当前模型还是只需将模型的代码 ($this->db->...) 放入文件中? @user1257255 这仅适用于登录用户,对吧?仅当最后一个活动超过 5 分钟之前,您才希望使用 last_activity 时间戳更新登录用户的记录?那是对的吗?我只是不确定你遇到了什么问题。 @WesleyMurch,登录到另一个表不是更好吗?间隔会有所帮助,但仍然;)。此外,会话值似乎没有更新,即$this-&gt;session-&gt;set_userdata('last_activity', now());

以上是关于CodeIgniter:将最后一个活动存储到数据库中的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter--将“活动”css类添加到链接,如何?

如何将活动类添加到 codeigniter 超链接?

CodeIgniter:如何使用活动记录将一个列值移动到另一个具有 Where 条件的值

CodeIgniter 活动记录调用多个存储过程的问题

codeigniter 查询生成器和活动记录 sql 注入

使用带有codeigniter的google api将google登录用户数据存储到会话中