我已經在使用PHP的大學項目上創建了一個購物車,並且可以通過項目鏈接添加到購物車,這會在我的數據庫中更新我的購物車表格,然後打印出來。PHP邏輯比較購物車中的會話ID?
我希望能夠刪除表中的eveything一旦用戶已退出頁面或關閉他們的瀏覽器(我認爲這是當會話ID變化)。但我不能想到這樣做的邏輯?
歡呼聲
我已經在使用PHP的大學項目上創建了一個購物車,並且可以通過項目鏈接添加到購物車,這會在我的數據庫中更新我的購物車表格,然後打印出來。PHP邏輯比較購物車中的會話ID?
我希望能夠刪除表中的eveything一旦用戶已退出頁面或關閉他們的瀏覽器(我認爲這是當會話ID變化)。但我不能想到這樣做的邏輯?
歡呼聲
您可以使用一些時間邏輯「清除」您的表。例如,當用戶回到您的頁面(您可以使用$ _SESSION,$ _COOKIE,$ REMOTE_ADDRESS等進行驗證),如果該「第二個」視圖之後(也許是2天),則可以'清除'這些數據。或者,您可以在數據庫中創建一個「作業」,以檢查用戶上次訪問網頁的時間(列'last_login'),並再次刪除該用戶添加的卡內的任何產品。
通常這樣做是爲了跟蹤用戶的上一次活動。
每次任意用戶打開一個頁面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
...
檢查所有用戶聽起來像一個昂貴的操作,但是你要考慮幾件事情:
SELECT
找到誰註銷(如果你需要的話)和一個UDPATE
來註銷它們下面是一個簡單的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部分做了一些說明。
使用JavaScript在用戶關閉瀏覽器時向您的服務器發送AJAX請求,您可以使用Javascript事件「onBeforeUnload」進行檢查。這樣腳本將確保會話和數據庫記錄只在用戶離開網站時被刪除。
<script type="text/javascript">
$(window).on('beforeunload', function() {
$.ajax({
url: /yourfileDeleteSession.php
});
});
</script>
我不會使用客戶端觸發的操作,它可能無法按預期工作,原因很多:瀏覽器崩潰,互聯網連接,錯誤可能會導致重複操作 – ColOfAbRiX
會話中應該有一個用戶標識。當他退出時,從該用戶的數據庫中刪除所有數據。你可以做到這一點,當你保存每行用戶id' – DocRattie
用戶不需要登錄來創建用戶ID?如果不是,那麼sytax會查找用戶ID? –
當有人進入頁面並在會話中使用該頁面時,您可以創建一個隨機ID。 – DocRattie