4

基本的に、この質問のポスターと同じ問題に遭遇しています。データベースは正しく初期化されています。と で、データベースとセッション SaveHandler の両方の初期化を試みましapplication.iniBootstrap。どうやっても同じ結果。

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

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"

Bootstrap の初期化は次のようになります。

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

}

私のセッションデータベーステーブルは次のように定義されています:

create table sesssions (
    sessionID char(32) primary key not null, 
    lastModifiedTime timestamp, 
    lifetime timestamp, 
    data text
) engine=innodb;

私は、その内容をセッションにダンプするだけの非常に単純な 1 フィールド フォームを使用してこれをテストするテスト アクションを用意しています。アクションは次のようになります。

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


}

ビューはフォームを表示するだけです。

値が実際にセッションに入ったかどうかをテストするには、index アクションを使用します。問題のインデックス アクションは次のとおりです。

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

今。セッション保存を使用するように構成してZend_Session_SaveHandler_DbTableいない場合、つまり、セッション保存をまったく構成していない場合、これは正常に機能します。フォーム フィールドに値を入力し、index アクションに移動して、出力を返します。セッションは想定どおりに機能します。

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

試してみたいものがなくなってきました。Mysql テーブルを通常のテーブルと InnoDB テーブルとして使用しました。データベースとセッション構成のすべての順列を試しました。これには、db を構成配列に指定し、1 つを Bootstrap で初期化し、もう 1 つを で初期化します.ini。手がかりを求めて Web と StackOverflow を調べました。他の人が同様の問題について投稿しているのを見たことがありますが、私が見つけた答えはどれもうまくいきませんでした。私は何をしていないのですか?私は何を台無しにしましたか?どうすればそれを機能させることができますか?

4

1 に答える 1

5

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

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

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

于 2011-03-04T19:52:23.617 に答える