2015-04-23 40 views
0

我已經在使用PHP的大學項目上創建了一個購物車,並且可以通過項目鏈接添加到購物車,這會在我的數據庫中更新我的購物車表格,然後打印出來。PHP邏輯比較購物車中的會話ID?

我希望能夠刪除表中的eveything一旦用戶已退出頁面或關閉他們的瀏覽器(我認爲這是當會話ID變化)。但我不能想到這樣做的邏輯?

歡呼聲

+0

會話中應該有一個用戶標識。當他退出時,從該用戶的數據庫中刪除所有數據。你可以做到這一點,當你保存每行用戶id' – DocRattie

+0

用戶不需要登錄來創建用戶ID?如果不是,那麼sytax會查找用戶ID? –

+0

當有人進入頁面並在會話中使用該頁面時,您可以創建一個隨機ID。 – DocRattie

回答

0

您可以使用一些時間邏輯「清除」您的表。例如,當用戶回到您的頁面(您可以使用$ _SESSION,$ _COOKIE,$ REMOTE_ADDRESS等進行驗證),如果該「第二個」視圖之後(也許是2天),則可以'清除'這些數據。或者,您可以在數據庫中創建一個「作業」,以檢查用戶上次訪問網頁的時間(列'last_login'),並再次刪除該用戶添加的卡內的任何產品。

1

通常這樣做是爲了跟蹤用戶的上一次活動。

每次任意用戶打開一個頁面a last_log條目爲所有登錄的用戶在數據庫中進行檢查。如果最後一次用戶做了某件事的時間早於N分鐘,則會話過期。然後,您可以將用戶註銷並刪除其項目。

您可能會提出這樣一個問題:「如果沒有用戶正在打開頁面,會發生什麼?將不會有人觸發代碼的執行」。在那種情況下,也沒有人有興趣知道任何購物車的內容,並且表格可以保持填充狀態。要解決此問題,使用此解決方案,您可能需要在服務器上運行計劃任務。

這裏的步驟摘要:

... 
Retrieve the list of expired sessions since the last check 
For every expired session 
    Remove the items from the shopping cart 
Update the last_log entry for the current user 
... 

檢查所有用戶聽起來像一個昂貴的操作,但是你要考慮幾件事情:

  1. 一個SELECT找到誰註銷(如果你需要的話)和一個UDPATE來註銷它們
  2. SQL被優化爲僅更新所有可能用戶的子集
  3. 該表將在相關字段上有一個索引以加速該過程
  4. 您目前在會話超時窗口中有多少用戶活動?一個真正最壞的情況在半個小時內將達到100,000個用戶。對於RDBMS來說,所有這些都不是什麼大問題。

下面是一個簡單的SQL(無特定語言):

-- Used to check which user session have expired since the last check 
SELECT username FROM session_table WHERE last_log < SUBTRACT(DATE(), 30 MINTUES) AND logged = 'true'; 

-- Used to log out the users after the timeout 
UPDATE session_table SET logged = 'false' WHERE last_log < SUBTRACT(DATE(), 30 MINTUES) AND logged = 'true'; 

-- Used to update the last_log entry for the current user 
UPDATE session_table SET last_log = DATE() WHERE user_id = "..."; 

爲此,您可以使用cookie或會話,但我更喜歡DB,因爲它避免了處理PHP會話跟蹤,並允許例如,如果您希望保留「稍後保存」或「草稿」項目列表,則可以執行更復雜的操作。

更新:我對logid和DB/SQL部分做了一些說明。

0

使用JavaScript在用戶關閉瀏覽器時向您的服務器發送AJAX請求,您可以使用Javascript事件「onBeforeUnload」進行檢查。這樣腳本將確保會話和數據庫記錄只在用戶離開網站時被刪除。

<script type="text/javascript"> 
    $(window).on('beforeunload', function() { 
     $.ajax({ 
      url: /yourfileDeleteSession.php 
     }); 
    }); 
</script> 
+0

我不會使用客戶端觸發的操作,它可能無法按預期工作,原因很多:瀏覽器崩潰,互聯網連接,錯誤可能會導致重複操作 – ColOfAbRiX