2014-05-23 76 views
0

我有一個使用YII的網站。它所做的一件事是將會話信息存儲到MySql數據庫表YiiSession中。此外,在一個單獨的表(users_sessions),一個新行插入以下信息:當用戶註銷YII時,與會話關聯的行被刪除

  • 會話ID
  • 用戶ID
  • 用戶的在線狀態

我創建另一個表因爲YiiSession是YII的一部分。另外users_session跟蹤用戶的在線狀態,而YiiSession不會。

我只在用戶登錄期間插入到users_session中。

但我不明白,當用戶註銷時,與用戶關聯的會話被刪除。

請注意,users_session中的session_id是YiiSession中的一個外鍵。但YiiSession中的一個仍然存在,即使它有一個到期日期。

可能刪除該行的機制是什麼?請幫忙。

+0

我想你可以那句你的問題更好。 「但我不明白,當用戶註銷時,與用戶關聯的會話被刪除。」通常會話刪除(銷燬)包含在註銷中,因此非常合理,我想你是從SQL角度談論的,但要確保你需要重新說明這一點。 – Jonast92

+0

嗨Jonast92,我不明白它是如何得到刪除user_session(該表由我創建的),但不是在YiiSession(該表是Yii設置的一部分)。並刪除它的機制? – ethereal1m

回答

0

您應該擴展CDbHttpSession並覆蓋方法destroySession($id)。在那裏你追加代碼並刪除你的條目。

配置的Yii使用會話類,而不是它自己的配置/ main.php:

'session' => array(
    'autoStart' => true, 
    'class' => 'application.components.<your session class name>', 
    'connectionID' => 'db', 
    'sessionTableName' => 'session', 
    'autoCreateSessionTable' => false, 
    'timeout' => 3600, // 60 min 
), 

但是我不會這麼做有一個單獨的表,只是將某些字段添加到YiiSession表。這就是我所做的,它工作得很好。

編輯: 您應該創建一個在protected/components名爲MyDbHttpSession.php文件。 在這個文件中,像這樣延長CDbHttpSession:

class MyDbHttpSession extends CDbHttpSession 
{ 
    protected function createSessionTable($db, $tableName) 
    { 
     // basically this is a copy of CDbHttpSession 

     $db->createCommand()->createTable($tableName, array(
      'id' => 'CHAR(32) PRIMARY KEY', 
      'expire' => 'integer', 
      'data' => $blob, 
      // your additional fields 
      'idUser' => 'INT(10) NULL', 
      'online' => 'TINYINT(1)', 
      // more of your fields here if you have 
     )); 
    } 

    // this sets the user ID by session ID 
    public function setIdUser($idUser) 
    { 
     $db = $this->getDbConnection(); 
     $db->setActive(true); 
     $db->createCommand()->update($this->sessionTableName, array('idUser' => (int) $idUser), 
      'id=:id', array(':id' => $this->sessionId) 
     ); 
    } 

    // and this sets the online status, pass true or false to $online 
    public function setOnline($online) 
    { 
     $db = $this->getDbConnection(); 
     $db->setActive(true); 
     $db->createCommand()->update($this->sessionTableName, array('online' => (int) $online), 
      'id=:id', array(':id' => $this->sessionId) 
     ); 
    } 
} 

設置的Yii使用會話類,而不是它自己的像我上面寫的。

您應該已經有一個類WebUser。如果不是,請在protected/components中創建一個,並將其擴展爲CWebUser。 在這個類添加一個方法afterLogin

public function afterLogin($fromCookie) 
{ 
    // store user ID and online status in session table 
    Yii::app()->session->setIdUser($this->id); 
    Yii::app()->session->setOnline(true); 

    return parent::afterLogin($fromCookie); 
} 

你可以從無論你在使用的Yii或Yii::app()->session->setOnline(true);Yii::app()->session->setOnline(false);

+0

chris,感謝您的建議,但我仍然沒有得到有關刪除user_session中的行但不在YiiSession中的機制的答案。 – ethereal1m

+0

如果我想使用1個表YiiSession而不是兩個表,我怎樣才能讓每次用戶登錄時,會話還插入其他信息,如用戶IP地址,用戶ID和用戶狀態?你能給我一個指針,以便我能理解這個機制嗎?問候 – ethereal1m

+0

好吧,我已經添加了一個例子。 –