Zend_Session_SaveHandler_DbTable是否每次刷新都擦除会话?

Dan*_*ham 4 php database zend-framework zend-session

基本上,我遇到了同样的问题按照海报上这个问题.我的数据库已正确初始化.我试着做数据库和会话都SaveHandler的初始化中application.ini,并在Bootstrap.无论我怎么做,结果都一样.

这是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"
Run Code Online (Sandbox Code Playgroud)

以下是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();

}
Run Code Online (Sandbox Code Playgroud)

我的会话数据库表定义如下:

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

我有一个测试操作,通过一个非常简单的一个字段形式测试它,只是将其内容转储到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; 
}
Run Code Online (Sandbox Code Playgroud)

这是它使用的表单:

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


}
Run Code Online (Sandbox Code Playgroud)

视图只显示表单.

为了测试值是否实际进入会话,我使用索引操作.这是有问题的索引操作:

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

现在.如果我没有配置使用会话保存Zend_Session_SaveHandler_DbTable,即,如果我没有配置会话保存,那么这工作正常.我在表单字段中输入一个值,转到索引操作并将其输出给我.会话完全按照预期的方式工作.

如果我Zend_Session_SaveHandler_DbTable在或者application.iniBootstrap中配置了,那么当我在测试字段中输入一个值并转到索引操作时,该值就消失了.我的数据库表有一行正确,sessionIDsessionID在我的浏览器中匹配一个cookie.但是数据库中没有其他信息. data为NULL,两个TIMESTAMP字段都清零.

我已经没事了.我把Mysql表作为常规表和InnoDB表.我已经尝试了我可以提出的数据库和会话配置的每个排列,包括将db提供给配置数组,并在Bootstrap中初始化一个,在另一个中初始化.ini.我已经搜索了网络和StackOverflow的线索.我见过其他人发布类似的问题,但我发现的答案都没有奏效.我没做什么?我搞砸了什么?我怎样才能使它工作?

isc*_*odv 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;
Run Code Online (Sandbox Code Playgroud)

经过这个小小的修改后它应该可行.