2014-05-23 2 views
0

YII를 사용하는 사이트가 있습니다. 한 가지는 세션 정보를 MySql 데이터베이스 테이블 YiiSession에 저장하는 것입니다. 또한 별도의 테이블 (users_sessions)에서, 새 행은 다음 정보와 함께 삽입됩니다 YII에서 사용자 로그 아웃시 세션과 연결된 행이 삭제됩니다.

  • 세션 ID가
  • 사용자 ID는

내가 다른 테이블을 사용자의

  • 온라인 상태를 만들
  • 왜냐하면 YiiSession은 YII의 일부이기 때문입니다. 또한 users_session은 사용자의 온라인 상태를 추적하지만 YiiSession은 그렇지 않습니다.

    사용자 로그인 중에는 users_session에만 삽입됩니다.

    하지만 사용자가 로그 아웃 할 때 사용자와 연결된 세션이 삭제된다는 사실을 이해하지 못합니다.

    users_session의 session_id는 YiiSession의 foreign_key입니다. YiiSession의 유효 기간이 만료되었지만 YiiSession의 항목은 계속 존재합니다.

    행을 삭제할 가능성이있는 메커니즘은 무엇입니까? 도와주세요.

    +0

    난 당신이 문구 질문을 더 나은 수 생각이 YII에있는 곳에서

    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); } 

    당신이 할 수있는 사용 :이 클래스에서 는 방법 afterLogin를 추가합니다. "그러나 사용자가 로그 아웃 할 때 사용자와 관련된 세션이 삭제되었음을 이해하지 못합니다." 일반적으로 세션 삭제 (삭제)는 로그 아웃에 포함되어 있으므로 완벽하게 이해할 수 있습니다. 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/componentsMyDbHttpSession.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을 확장하십시오. Yii::app()->session->setOnline(true); 또는 Yii::app()->session->setOnline(false);

    +0

    chris, 귀하의 제안에 감사드립니다,하지만 난 여전히 사용자 세션에서 행을 삭제하지만 YiiSession에서 어떤 메커니즘에 대한 대답을 가지고 있지 않습니다. – ethereal1m

    +0

    2 개의 테이블 대신 1 개의 테이블 YiiSession을 사용하려면 어떻게해야 사용자가 로그인 할 때마다 세션에서 사용자 IP 주소, 사용자 ID 및 사용자 상태와 같은 추가 정보를 삽입 할 수 있습니까? 메커니즘을 이해할 수 있도록 포인터를 줄 수 있습니까? 안부 – ethereal1m

    +0

    좋아, 내가 예제를 추가했습니다. –

    관련 문제