繁体   English   中英

Zend:在生成会话ID之后从会话数据库表中获取行

[英]Zend: Fetching row from session db table after generating session id

我正在尝试在对用户进行身份验证并将会话写入数据库之后直接更新Zend_Session_SaveHandler_DbTable使用的会话表。 但是,即使我用来检查(Zend_Session :: getId())的会话ID有效且该行确实已插入表中,我也无法更新或获取新插入的行。 提取所有会话ID(在同一请求上)后,结果中缺少我新插入的会话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);

$ update失败。
$ load不包含用$ auth-> getStorage()-> write($ identity)编写的行。 $ qload确实包含正确的查询-将其复制到其他地方会产生预期的结果,即插入的行包含在结果中。

使用的数据库是MySQL-InnoDB。

如果有人知道如何直接解决此问题(即,在同一请求上,而不是在重定向到另一个页面后进行更新),而无需修改Zend_Session_SaveHandler_DbTable:非常感谢!

这不是Zend框架的问题,而是Sessions在PHP中的工作方式的问题。 在您的情况下,当您创建新的会话时,会生成新的会话ID,但是该会话仅存在于内存中,直到脚本退出。

来源:PHP会话处理,注释

您也许可以通过使用生成的Session ID作为主键(或主键的组件)添加不同的表来保存会话元数据来处理同一请求。 如果采用这种方式,请扩展Zend_Session_SaveHandler_DbTable并覆盖destroy()方法,以在Session过期并被垃圾回收时保持元数据表的清洁。

您需要先“分离/释放”会话,然后才能执行任何操作。 您可以通过调用:Zend_Session :: writeClose();来实现。 然后,您应该能够根据需要获取/更新行。 请记住,它将使您的会话为只读,因此请确保在断开连接后无需再对其进行写入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM