codeigniter会话保存到数据库不断更新

时间:2013-05-05 21:10:17

标签: codeigniter session codeigniter-2 destructor

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

我目前已启用会话来使用数据库,但它的工作原理只有一个问题,因为每次更新会话时它都会更新数据库。

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

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

enter image description here

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

Controller / auth [包含真实登录的帖子]

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直到结束,

仅在所有runtime -destructor结束时更新user_data-最终结果会话足以将会话保存到db。

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

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

由于

2 个答案:

答案 0 :(得分:1)

我找到了解决方案,使用以下代码

从会话中获取现有用户数据
$userdata = $this->session->all_userdata();
$userdata['fname'] = 'John';
$userdata['lname'] = 'Mulharn';
$userdata['email'] = 'Mulharn@john.com';
$this->session->set_userdata($userdata);

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

答案 1 :(得分:0)

可以通过传递包含所有值的数组来更新会话,而不是一次执行一个。请再次查看“用户指南”