2012-03-05 19 views
2

私は奇妙な問題があります。訪問者がサイトに初めて来て、私は何かをセッションに設定しても、それは固執しません。 2回目以降、私はそれが固執する何かを設定しようとします。最初の試行の後、私はセッションを破棄して何かを設定し、それを固執することができます。何かを保存しようとする最初の試みは失敗します。私は$_SESSION['uid'] = $row["Id"];とセッションに何かを保存しようとしています。私は$row["Id"]が有効で、データを保持していることを知っています(私はそれをエコーし​​ました)。PHPセッションが初めて設定されていません

私は標準セッションを使用していません。セッションをデータベースに保存しています。私のセッションクラスは以下の通りです。この行為を説明するために私が行方不明または間違っていることはありますか?

更新

さて、私は自分自身でセッションクラスをテストし、それが動作しているようだ: - /しかし、私は私の大きなアプリケーション_writeでそれを使用するときに__destructが呼び出さんが、呼ばれることは決してありません。それが何であるか、どんな考えですか?

<?php 

include_once('db.php'); 

class PDOSession 
{ 
    protected $pdo; 
    protected $table = 'SessionData'; 

    public function __construct() 
    { 
     // Get a database connection 
     $db = new PDOConnectionFactory(); 
     $this->pdo = $db->getConnection(true); 

     // Start session 
     session_set_save_handler(array($this, '_open'), 
           array($this, '_close'), 
           array($this, '_read'), 
           array($this, '_write'), 
           array($this, '_destroy'), 
           array($this, '_gc')); 
     session_start(); 
    } 

    public function __destruct() 
    { 
     session_write_close(); 
    } 

    protected function fetchSession($id) 
    { 
     $stmt = $this->pdo->prepare('SELECT id, data FROM '.$this->table.' WHERE id = :id AND unixtime > :unixtime'); 
     $stmt->execute(array(':id' => $id, ':unixtime' => (time() - (int)ini_get('session.gc_maxlifetime')))); 
     $sessions = $stmt->fetchAll(); 

     return empty($sessions) ? false : $sessions[0]; 
    } 

    public function _open($savePath, $sessionName) 
    { 
     return true; 
    } 

    public function _close() 
    { 
     return true; 
    } 

    public function _read($id) 
    { 
     $session = $this->fetchSession($id); 
     return ($session === false) ? false : $session['data']; 
    } 

    public function _write($id, $sessionData) 
    { 
     $session = $this->fetchSession($id); 
     if($session === false) { 
      $stmt = $this->pdo->prepare('INSERT INTO '.$this->table.' (id, data, unixtime) VALUES (:id, :data, :time)'); 
     } else { 
      $stmt = $this->pdo->prepare('UPDATE '.$this->table.' SET data = :data, unixtime = :time WHERE id = :id'); 
     } 
     $stmt->execute(array(
         ':id' => $id, 
         ':data' => $sessionData, 
         ':time' => time() 
         )); 
    } 

    public function _destroy($id) 
    { 
     $stmt = $this->pdo->prepare('DELETE FROM '.$this->table.' WHERE id = :id'); 
     $stmt->execute(array(':id' => $id)); 
    } 

    public function _gc($maxlifetime) 
    { 
     $stmt = $this->pdo->prepare('DELETE FROM '.$this->table.' WHERE unixtime < :time'); 
     $stmt->execute(array(':time' => (time() - (int) $maxlifetime))); 
    } 
} 
$newPDOSessionStartHere = new PDOSession(); 

答えて

1

私はちょっと馬鹿だと思います。私はsession_unset()ではなく、session_destroy()と呼んで、認証スクリプトの一番上にあるものをクリアしました。クラスは正常に動作します。

0

クラスを定義した後にセッションを開始する必要があると思います。内部ではありません。

+0

これは違いはありません。 – Justin808

関連する問題