2011-03-01 27 views
4

私は基本的にthis questionのポスターと同じ問題に遭遇しています。私のデータベースは正しく初期化されています。私はapplication.iniBootstrapのデータベースとセッションSaveHandlerの初期化を試みました。どのようにしても同じ結果になります。Zend_Session_SaveHandler_DbTableはリフレッシュごとにセッションを消去していますか?

resources.db.adapter = "pdo_mysql" 
resources.db.params.host = "localhost" 
resources.db.params.username = "uname" 
resources.db.params.password = "******" 
resources.db.params.dbname = "dbname" 

resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable" 
resources.session.saveHandler.options.name = "sessions" 
resources.session.saveHandler.options.primary = "sessionID" 
resources.session.saveHandler.options.modifiedColumn = "lastModifiedTime" 
resources.session.saveHandler.options.dataColumn = "data" 
resources.session.saveHandler.options.lifetimeColumn = "lifetime" 

そして、ここのようなブートストラップ初期化が見えたものだ:

create table sesssions (
    sessionID char(32) primary key not null, 
    lastModifiedTime timestamp, 
    lifetime timestamp, 
    data text 
) engine=innodb; 
を次のように私のセッションのデータベース・テーブルが定義されている

protected function _initSession() { 
     $db = Zend_Db::factory('Pdo_Mysql', array(
      'host'  =>'localhost', 
      'username' => 'uname', 
      'password' => '******', 
      'dbname' => 'dbname' 
     )); 
     Zend_Db_Table_Abstract::setDefaultAdapter($db); 


    $sessionConfig = array( 
      'name'   => 'sessions',  
      'primary'  => 'sessionID', 
      'modifiedColumn' => 'lastModifiedTime',  
      'dataColumn'  => 'data', 
      'lifetimeColumn' => 'lifetime' 
     ); 
     $saveHandler = new Zend_Session_SaveHandler_DbTable($sessionConfig); 
     Zend_Session::setSaveHandler($saveHandler); 
     Zend_Session::start(); 

} 

ここ

application.ini初期設定は次のようになります。

私はこれを非常に単純な方法でテストするテストアクションを持っていますその内容をSessionにダンプするフィールドフォーム。アクションは次のようになります。

public function addAction() 
{ 
    $namespace = new Zend_Session_Namespace(); 

    $form = new Application_Form_AddToSession(); 
    $request = $this->getRequest(); 
    if ($request->isPost()) { 
     if ($form->isValid($request->getPost())) { 
      $namespace->content = $request->getParam('toAdd'); 
     } 
    } 
    $this->view->form = $form; 
} 

は、ここでそれが使用する形式です:

class Application_Form_AddToSession extends Zend_Form 
{ 

    public function init() 
    { 
     $this->setMethod('post'); 

     $this->addElement('text', 'toAdd', array(
      'filters' => array('StringTrim', 'StringToLower'), 
      'validators' => array(
       array('StringLength', false, array(0, 256)), 
      ), 
      'required' => true, 
      'label'  => 'Add:', 
     )); 

     $this->addElement('submit', 'add', array(
      'required' => false, 
      'ignore' => true, 
      'label' => 'Add', 
     )); 
    } 


} 

ビューだけでフォームを示しています。

値が実際にセッションに入ったかどうかをテストするために、私はインデックスアクションを使用します。これは問題のインデックスアクションです:

public function indexAction() 
{ 
    $namespace = new Zend_Session_Namespace(); 
    echo 'Content: '.$namespace->content.'<br>'; 
    echo '<pre>'; print_r($_SESSION); echo '</pre>'; 
} 

Now。 Zend_Session_SaveHandler_DbTableを使用するようにセッションの保存を設定していない場合、つまりセッションの保存がまったく設定されていない場合、正常に動作します。私はフォームフィールドに値を入力し、インデックスアクションに行き、それを私に送り返します。セッションは、想定されているとおりに動作します。

application.iniまたはブートストラップのいずれかにZend_Session_SaveHandler_DbTableが設定されている場合、テストフィールドに値を入力してインデックスアクションに移動すると値がなくなります。データベーステーブルに適切なsessionIDの行があり、sessionIDがブラウザのクッキーと一致しています。しかし、データベースには他の情報はありません。 dataはNULLであり、TIMESTAMPの両方のフィールドはゼロになります。

私は試してみることを使い果たしました。私は通常のテーブルとInnoDBテーブルとしてMysqlテーブルを持っています。私はdbを構成配列に渡し、ブートストラップにあるものとにあるものを初期化することを含め、データベースとセッション構成のすべての順列を試しました。私は手がかりを求めてWebとStackOverflowを精査しました。他の人が同様の問題について投稿しているのを見たことがありますが、私が見つけた回答はどれもうまくいきませんでした。私は何をしていないのですか?私は何をねじ込みましたか?どうすればそれを動作させることができますか?

答えて

5

問題はlastModifiedTimeおよびlifetime列をタイムスタンプとして定義したことです。代わりにINTにする必要があります。

CREATE TABLE `sessions` (
`sessionID` char(32) NOT NULL, 
`lastModifiedTime` INT, 
`lifetime` INT, 
`data` text, 
PRIMARY KEY (`sessionID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

この小さな変更の後で動作するはずです。

+0

美しい。私はそれがドキュメントにあったことを願っています... –

+1

私はちょうどそれがINIの設定を持って、実際のinitメソッドでそれを使用するのは奇妙だと付け加えたいと思います。将来、奇妙な動作につながる可能性があります(実装方法を忘れたり、他の人がそれを使用することになります) –

関連する問題