在会话中设置user_data会产生不同的结果

时间:2013-08-31 00:58:11

标签: php codeigniter session

好的,所以这个让我感到困惑。

当用户登录时,我在会话中设置了userdata,如下所示:

$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用于更新数据库中的信息,然后重复使用它来通过索引在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

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

所以说到这里,这是我的官方问题:

如何控制会话数据的输入,使其成为数组或对象?

1 个答案:

答案 0 :(得分:0)

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

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

然后当您更新Users表时 - 会话中的唯一ID保持不变。您将更新的结果返回给控制器,您不必大惊小怪。

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

  • 从会话中获取唯一ID
  • 搜索具有唯一ID的用户表
  • users表返回包含所需字段的对象(或数组)
  • 在您的应用中使用该用户对象(而非会话)

所以我们只使用会话cookie来存储唯一ID 。现在我们有了选项 - 如果用户提交表单来更新其个人资料,那么您可以在隐藏表单字段中传递唯一ID。你得到唯一的ID,你不必处理cookie。再次,这只适用于加扰的唯一id字符串(不是连续的id)。

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

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

然后使用唯一ID - 你会收到一个名为$ editsession的对象,很容易获得$ editsession-> userid $ editsession-> storyid $ editsession-> status

等值
// 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的文件夹中: - )