2010-03-22 40 views
1

我試圖在認證用戶並將會話寫入數據庫後直接更新由Zend_Session_SaveHandler_DbTable使用的會話表。但是我既不能更新也不能獲取新插入的行,即使我用來檢查(Zend_Session :: getId())的會話ID是有效的,並且行確實被插入到表中。在獲取所有會話ID時(在相同的請求上),我新插入的那個會從結果中丟失。它確實出現在結果中,如果我用其他東西獲取它。 我檢查過它是否是交易問題,而且看起來並不是問題 - 當我提取結果時沒有活動事務。我也嘗試在使用sleep()寫入後幾秒鐘讀取,這沒有幫助。Zend:生成會話ID後從會話數據庫表獲取行

$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 failed。
$ load不包含用$ auth-> getStorage() - > write($ identity)寫入的行。 $ qload確實包含正確的查詢 - 將其複製到其他地方會導致預期的結果,即插入的行包含在結果中。

使用的數據庫是MySQL - InnoDB。

如果有人知道如何在不修改Zend_Session_SaveHandler_DbTable的情況下直接解決此問題(即在相同的請求上,而不是在重定向到另一個頁面之後進行更新):非常感謝!

回答

1

這不是Zend Framework的問題,而是Sessions如何在PHP中工作的問題。在你的情況下,當你創建一個新的會話時,會生成新的會話ID,但會話只在內存中存在,直到腳本退出。

Source: PHP Session Handling, Notes

你或許可以通過添加不同的表來保存會話元數據,使用所生成的會話ID作爲主鍵(或主鍵的成分)處理該上相同的請求。如果你走這條路線,擴展Zend_Session_SaveHandler_DbTable並覆蓋destroy()方法,以便在Sessions過期並垃圾收集時保持元數據表清潔。

0

您需要先「分離/釋放」您的會話,然後才能對其執行任何操作。 你可以通過調用: Zend_Session :: writeClose(); 然後您應該能夠根據需要獲取/更新行。請記住,它會使您的會話爲只讀,因此只要確保在分離後不需要寫入即可。