2013-08-31 34 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

相關問題