2013-08-31 29 views
0

好的,所以这一个困惑我。在会话中设置user_data给出不同的结果

当我在用户登录设置在会话中的用户数据,像这样:

$data = array(); 
$data['email'] = $this->input->post('email'); 
// get the user's info where it matches their email in the db. 
$user = $this->User_model->get_user($data); 
$this->session->set_userdata('user_session', $user); 

现在这个伟大的工程。它在会话数据中创建user_session作为对象。我可以。

然后当用户更新他们的信息时,我想重置user_session中的数据以匹配他们的新数据。我这样做,像这样:

$data = array(
    'first_name' => $this->input->post('first_name'), 
    'last_name' => $this->input->post('last_name'), 
    'email' => $this->input->post('email'), 
    'phone' => $this->input->post('phone'), 
    'street1' => $this->input->post('street1'), 
    'street2' => $this->input->post('street2'), 
    'city' => $this->input->post('city'), 
    'state' => $this->input->post('state'), 
    'zip' => $this->input->post('zip'), 
    'password' => $encrypted_password, 
    'organizations_id' => $this->input->post('org_select') 
); 

$user = $this->User_model->get_user($data); 
$this->session->set_userdata('user_session', $data); 

现在,这里的$data被用来更新自己的DB信息,然后我再用它在他们email拉他们出来的数据通过索引。

最后,这里是我使用他们两人的模型方法:

public function get_user($data) 
{ 
    return $this->db 
     ->where('email', $data['email']) 
     ->select('first_name, last_name, email, password, id, organizations_id') 
     ->get('users') 
     ->row(); 
} 

这工作,但方式不同。与其给我一个对象,它只是给了我一个数组。这导致了我的代码中其他地方的很多问题。

如何控制是否它给我一个对象或数组?


编辑:

我意识到白痴的举动。当用户更改其信息时,我将$data而不是$user发送给我的模型。

所以我解决了这个问题,现在我得到一个对象两次。但我仍然想知道这两种方法如何产生不同的结果。这样我可以在将来控制它。

所以他这样说,这里是我的官问:

我如何控制会话数据的输入,所以它是数组或对象?

回答

0

很好的选择 - 在你的用户表中创建一个名为uniqueid的字段。当您创建用户时 - 生成随机字符串 - 这是您的唯一ID - 将其包含在插入数据中。

创建一个新的会话 - 只存储唯一的ID。

然后当您更新用户表时 - 会话中的唯一ID保持不变。您将更新后的结果返回给您的控制器,您不必担心会话。

后唯一ID的典型流程设置:

  • 从会议上获得的唯一ID
  • 搜索用户表,唯一的ID
  • users表中返回一个包含你的域对象(或阵列)需要
  • 使用该用户对象在您的应用程序(而不是会话)

所以我们只使用会话cookie来存储唯一标识。现在我们有选择 - 如果用户提交表单来更新他们的个人资料,那么你可以在隐藏的表单字段中传递唯一的ID。你得到唯一的身份证,你不必处理饼干。再次,这仅适用于乱码唯一ID字符串(不是顺序ID)。

编辑:如果您使用顺序ID,那么突然间您已经打开了一个安全漏洞。对于这个特定的应用程序可能无关紧要,但我推荐这种方法,因为它非常灵活。

另一种方式来做到这一点 - 特别是如果你有更复杂的应用程序,用户正在做的事情和从不同的表中绘制。例如,如果您需要累积或跟踪用户通过会话进行的操作 - 您可以拥有一个监督会话的表格 - 并使用唯一的ID。然后在会话表中存储'用户'标识 - 顺序标识 - 。您可以为其他表格添加更多ID,日期时间,状态,错误,总计等等。

所以再与唯一的ID - 你回来说叫$ editsession方便的对象,以获取在像$ editsession->用户ID $ editsession-> storyid $ editsession-值>状态

// example get your user 
if(! $user = $this->user->_get($editsession->userid) ;) 
{ $this->_error() ; } 
else { $this->_showEditor($user) ;} 

和这是一个样本随机字符串生成器

$uniqueid = random_string('alnum', 10); 

终于注意到,我称这个模型只是'用户'。即使在一个月前,我也会在模型文件名中添加'_model'或'_m'。 但这是错误的 - 它只是增加了噪音 - 所以现在就戒掉这个习惯,你的代码会更干净。所有的文件都清楚地显示在一个名为models的文件夹中:-)

+0

这实际上是一个非常好的主意。它是否必须是随机字符串?或者我可以在数据库中使用自动递增的数字(也就是说,它现在是如何设置的,每个用户都有自己的唯一编号,但它不是随机的) – JDillon522

+0

在编辑中回复 – cartalot

相关问题