2013-03-07 211 views
0

用戶配置文件數據在我的控制器無法更新數據庫

public function profile() { 
    $UserInfo = $this->Auth->user() 
    if(!empty($this->data)) { 
      print_r($this->data); 
     $this->User->save($this->data); 
    } 
    if(!empty($UserInfo['id'])){ 
     $this->data = $this->User->find('first',array('conditions'=>array('id'=>$UserInfo['id']))); 

    } 

} 

當我提交它不會提交到數據庫中的數據和我只得到一個值。

+1

什麼cakephp版本?您需要始終提供此信息以獲取正確的答案。 – mark 2013-03-07 09:14:36

+0

@amit:Cake提供了非常方便的debug()方法,可以使用調試級別0(在生產中)和調試級別1或2(用於開發)。你可以用debug($ this-> data)替換你的print_r; – 2013-03-07 14:19:16

回答

1

你爲什麼在這裏查詢會話?當然這會在保存之後再次獲得舊數據。

使用數據庫一如既往,再次更新數據庫,然後纔可能覆蓋會話(你似乎是用餅1.3):

public function profile() { 
    $uid = $this->Session->read('Auth.User.id'); 
    if (!empty($this->data)) { 
     $this->data['User']['id'] = $uid; 
     if ($this->User->save($this->data, true, array('email', 'first_name', 'last_name', 'id', ...))) { 
      // if you rely on auth session data from the user, make sure to update that here 
      $this->Session->write('Auth.User.email', $this->data['User']['email']); // etc 
      ... 
      // OK, redirect 
     } else { 
      // ERROR 
     } 
    } else { 
     $this->data = $this->User->find('first', ...); 
    } 
} 

正如你可以看到我更新過的會話密鑰改變。

如果使用2.x的(你沒有指定爲現在),你也可以使用

$this->Auth->login($this->request->data['User']); // must be the User array directly 

雖然你將不得不小心地通過所有已在會議之前的數據。 如果您計劃使用login(),最好再次找到(第一個)更新的記錄,然後將其傳遞給login()。

但個人而言,我更喜歡只更新實際更改的字段。

請參閱Editing own account/profile

+0

讓Auth寫自己的會話如何? $這 - > Auth->登錄($這 - >數據[ '用戶'] [ 'ID']); – 2013-03-07 13:53:16

+1

這隻會刪除除ID以外的所有內容... – mark 2013-03-07 14:05:33

+0

您已經使用您的更新解決了這個問題:D – 2013-03-07 14:08:02