2011-03-01 27 views
4

我基本上遇到了与this question中的海报相同的问题。我的数据库已正确初始化。我已经尝试在application.iniBootstrap中对数据库和会话SaveHandler进行初始化。无论我如何做,结果都是一样的。Zend_Session_SaveHandler_DbTable正在每次刷新时清除会话?

这里是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" 

而这里的引导初始化是什么样子:

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; 

我有一个测试行为,通过一个非常简单的测试一个字段形式只是将其内容转储到会话中。动作看起来是这样的:

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

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

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

我已经耗尽了东西试试。我已经将Mysql表格作为常规表格和InnoDB表格。我已经尝试了数据库和会话配置的每个组合,我可以提出,包括将数据库分配给配置数组,并初始化引导程序中的数据库和其他.ini中的数据库和会话配置。我搜索了Web和StackOverflow以寻找线索。我见过其他人发布过类似的问题,但我找到的答案都没有奏效。我没做过什么?我搞砸了什么?我怎样才能使它工作?

回答

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; 

经过这个小的修改后,它应该工作。

+0

美丽。我希望这是在文档中... – 2011-03-07 15:43:02

+1

我只是补充说,在INI中配置并且从不在实际的init方法中使用它是很奇怪的。将来可能会导致奇怪的行为(因为你忘记了它是如何实现的,或者别人会使用它) – 2011-03-10 20:19:07