簡體   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