我正在尝试在验证用户并将会话写入数据库后直接更新Zend_Session_SaveHandler_DbTable使用的会话表。但我既不能更新也不能获取新插入的行,即使我用来检查的会话ID(Zend_Session :: getId())是有效的,并且该行确实插入到表中。在获取所有会话ID(在同一请求上)后,我新插入的那个会在结果中丢失。如果我用其他内容获取它,它确实出现在结果中。 我已经检查了它是否是事务的问题而且似乎不是问题 - 当我获取结果时没有活动事务。我也尝试使用sleep()写几秒后取出,这没有帮助。
$auth->getStorage()->write($ident);
//sleep(1)
$update = $this->db->update('session', array('uid' => $ident->user_id), 'id='.$this->db->quote(Zend_Session::getId()));
$qload = 'SELECT id FROM session';
$load = $this->db->fetchAll($qload);
echo $qload;
print_r($load);
$更新失败。
$ load不包含使用$ auth-> getStorage() - > write($ identity)编写的行。 $ qload确实包含正确的查询 - 将其复制到其他地方会导致预期的结果,即插入的行包含在结果中。
使用的数据库是MySQL - InnoDB。
如果有人知道如何直接修复此问题(即在同一请求中,在重定向到另一个页面后没有做更新等事情)而不修改Zend_Session_SaveHandler_DbTable:非常感谢!
答案 0 :(得分:1)
这不是Zend Framework的问题,而是Sessions如何在PHP中运行的问题。在您的情况下,当您创建新会话时,将生成新的会话ID,但会话仅存在于内存中,直到脚本退出。
Source: PHP Session Handling, Notes
您可以使用生成的会话ID作为主键(或主键的组件),通过添加不同的表来保存会话元数据,从而在同一请求上处理此问题。如果你走这条路线,扩展Zend_Session_SaveHandler_DbTable并覆盖destroy()方法,以便在Sessions过期并垃圾收集时保持元数据表的清洁。
答案 1 :(得分:0)
您需要先“分离/释放”您的会话,然后才能对其执行任何操作。 您可以致电: Zend_Session组件:: writeClose(); 然后,您应该能够根据需要获取/更新行。请记住,它会使您的会话成为只读,因此请确保您在分离后不需要写入。