0

我有个问题。我正在使用最新版本的 CI。

我目前已启用会话以使用数据库,但它的工作方式只有一个问题,因为它倾向于在每次更新会话时更新数据库。

有没有办法解决这个问题,以便会话在破坏之前只更新一次数据库?!

我目前只有一个 CI 会话大约有 9 个更新请求 :) !所以任何帮助都会很可爱。

在此处输入图像描述

一个简单的代码示例,我的过程比这复杂得多,但仅用于演示目的

控制器/身份验证 [包括具有真实登录的帖子]

function login(){
$trial=$this->user->attempt($this->input->post('user'),$this->input->post('pass'));

if($trial){
//1st update query
$this->session->set_userdata('user',$trial);


//Start intializing user

//2nd update query
$this->load->model('relations');//constructer will load user friends and save them to $this->session->set_userdata('relations',$rel);

//3rd update query
$this->load->model('settings');//construtor will load user settings and save them to settings
}
}

上面的代码将创建 3 个更新请求,所有这些请求都针对更新字段 userdata = 当前会话。

我的观点是每次我们向会话中添加一些东西时都不需要更新数据库,它已经保存在 $_SESSION 中,所以保持在那里,并继续操作 $_SESSION 直到结束,

仅在所有运行时 -destructor- 结束时使用最终结果会话更新 user_data 就足以将会话保存到数据库。

请注意,CI 使用select * from ci_session(图片中的第一个请求)从会话加载会话,然后它只是不断重复更新会话且毫无意义,因为它不会在运行时再次选择它!

那么为什么不加载它一次加载会话库。并在它破坏之前保存它。这就是我想要完成的。

谢谢

4

2 回答 2

1

我找到了解决方案,使用以下代码从会话中获取现有用户数据

$userdata = $this->session->all_userdata();
$userdata['fname'] = 'John';
$userdata['lname'] = 'Mulharn';
$userdata['email'] = 'Mulharn@john.com';
$this->session->set_userdata($userdata);

所有这些都发生在 1 个事务中,而不是 3 个数据库事务中。希望有帮助。

于 2014-07-15T10:06:21.230 回答
0

A session may be updated by passing an array with all of the values, rather than doing them one at a time. Have another look in the Users' Guide

于 2013-05-05T21:47:41.877 回答