0

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

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

$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

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

话虽如此,这是我的官方问题:

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

4

1 回答 1

0

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

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

然后当您更新用户表时 - 会话中的唯一 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”。但这是错误的——它只会增加噪音——所以现在就改掉这个习惯,你的代码会更干净。所有文件都清楚地在一个名为模型的文件夹中:-)

于 2013-08-31T01:13:46.280 回答