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->session->set_userdata('last_activity', now());
以上是关于CodeIgniter:将最后一个活动存储到数据库中的主要内容,如果未能解决你的问题,请参考以下文章
Codeigniter--将“活动”css类添加到链接,如何?