2013-05-05 107 views
0

我有一个问题。我正在使用最新版本的CI。codeigniter会话保存到数据库不断更新多次

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

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

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

enter image description here

一个简单的代码示例,我proccess比这要复杂得多,但只是为了演示目的

控制器/ 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直到结束,

只更新USER_DATA一次在所有runtime -destructor的最后,最终结果会话足以将会话保存到db。

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

所以为什么不只是一旦加载会话库就加载它。并在破坏之前保存它。多数民众赞成什么即时尝试完成。

由于

+0

当然,如果您决定将会话数据存储在数据库中,那么只要会话更新,数据库就必须更新?你为什么要不要更新? – jleft 2013-05-05 21:21:31

+0

当然它应该更新..但只有一次就够了!它不需要每一次都进行更新..在所有工作完成后,只有一次该怎么办? – Zalaboza 2013-05-05 22:18:39

+0

程序中的哪些代码导致了这些请求? – jleft 2013-05-05 22:39:24

回答

0

会话可以通过使阵列的所有的值,而不是做他们每次一个被更新。有用户指南中再看看

+0

这与什么有什么关系? – Zalaboza 2013-05-05 22:19:18

+0

我无法从您的代码中知道,但我猜测您正在单独更新各个值。如果您不想继续更新,请查找更新发生的位置并停止执行更新。否则,请勿使用数据库更新 – jmadsen 2013-05-05 22:29:06

1

我已经找到了一个解决方案,通过使用下面的代码得到了会议的现有的用户数据

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

所有这一切都发生在1个交易而不是3数据库事务。 希望有所帮助。