我的登录已经排序,它设置了大约15-20个不同数据库项的数组,用户可以更改其中一些,管理员可以更改所有这些。
显然,对于一般用户来说,当他们在帐户上更改某些内容时,重置整个会话是愚蠢的。例如他们的名字。我的代码可以使用数据库,它在用户更改后输入名称。
$username=$this->session->userdata("logged_in");
if(strlen($name)>=1){
$databasename = $row->firstname;
if($name != $databasename){
$input_array['first']= $name;
$this->session->unset_userdata($username['name']);
$this->session->set_userdata($username['name'],$name);
}
}
要为我的代码添加一些背景,输入数组是在if语句之外定义的,如果名称不等于数据库名称并且名称已更改,则添加到输入数组。
所有这一切,都是将数据保存到数据库中,并且不会更改会话变量。理想情况下,他们需要改变,如果我注销然后重新开启,他们确实会改变,但这是不切实际的。
答案 0 :(得分:1)
如果我理解正确,您希望确保用户始终显示最新数据,即使管理员对其进行了一些更改,例如他的用户名。如果是这样,那么有3种方法可以做到这一点。
第一个
仅存储会话中的用户ID以及不需要更新的任何数据。然后,您可以选择所需的数据,例如请求发出时来自数据库的用户名。这将确保一切都始终是最新的。
第二个
在创建时,将用户的会话ID存储在数据库中。要获取会话ID,请使用 session_id函数。然后再次使用 session_id函数,但这次使用sesison中要作为第一个参数销毁的id。 e.g
session_id($old_session_id);
session_start();
session_destroy();
这将创建一个空的会话(因此杀死现有的会话),然后销毁就在那之后。然后用户下次访问您的网站时必须再次登录。
第三个
让PHP将会话存储在数据库中,这样您就可以修改它们或简单地删除它们并强制用户重新登录。然而,我会小心这个解决方案可能是一个矫枉过正,第一个是非常常见的,第二个也是一个很好的方式。
<强>解释强>
之所以不起作用的原因是会话仍然包含先前设置的旧数据。如果用户自己更新了他的用户名,那么你也可以在会话中设置它,但是如果管理员这样做(或者除了用户自己之外的任何其他人),用户名(例如,它当然可以是其他任何东西) )在会话中不会改变。
答案 1 :(得分:0)
也许是因为你得到变量$ logged_in并试图放回另一个名为“username”的变量。如果我理解你的问题,你需要保存logged_in:
$username['name'] = $name;
$this->session->unset_userdata('logged_in');
$this->session->set_userdata('logged_in',$username);