簡體   English   中英

在PHP / CodeIgniter中使用重新生成會話ID

[英]Working with regenerating session id in PHP/CodeIgniter

我正在使用CodeIgniter的Session類來管理購物車/結帳系統的會話。 會話數據存儲在數據庫中,會話ID存儲在cookie中。 所有購物車信息都通過AJAX檢索並與會話ID一起保留在會話中。

現在,我使用PHP / CodeIgniter生成的會話ID來跟蹤用戶。 用戶沒有登錄到該站點,並且商店和購物車/結帳系統位於不同的域,因此這是將他們綁定到存儲在會話/數據庫中的購物車的唯一方法。 我在表單上的隱藏字段中使用此會話ID,並在鏈接中將其用作參數,以便在任何請求(添加項,刪除項,查看購物車等)上將其發送到服務器。

CodeIgniter允許您設置一個時間來重新生成會話ID,現在我將其設置為10分鍾。 我默認使用它,但是它太短了,因為如果用戶在頁面上坐了太長時間,則動態寫入鏈接和表單的會話ID將會過時並且不再與購物車數據綁定。

這顯然不是一個很好的解決方案。 允許以較低的時間間隔重新生成會話ID,但即使用戶等待10分鍾以上(不刷新頁面)來執行操作,仍然使用戶與購物車數據保持聯系的最佳方法是什么?

不要在數據庫中使用會話ID。 購物車應跨會話保留,因此您需要存儲與用戶(而不是會話)相關的購物車。 我也不會將會話ID放在字段中作為隱藏字段。 會話的好處是您可以將它們存儲在服務器端。

將購物車存儲在數據庫中,不要將整個內容加載到會話中。

方法1

可以在數據庫中為用戶提供“活動”購物車。

User -> (has many) Cart

然后通過向購物車中添加商品來更新該購物車

/cart/add/{id}        -> Verify prices / quantities

該購物車未鏈接到會話,會話僅控制登錄的用戶。當他們簽出時,將購物車從“活動”設置為“有序”,並創建一個新的“活動”(但為空)購物車。 會話之間的購物車將保留在數據庫中,並且可以提供完整的歷史記錄。

方法#2

將整個購物車存儲在會話中,而不是針對數據庫進行備份。 這會使某些事情變得更簡單(添加/刪除項不是數據庫操作),但也不會在會話之間持久化。 當用戶簽出時,將購物車寫入數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM