2013-05-21 54 views
0

我不確定如何爲以下問題設計解決方案。我希望你能幫助我。關於在Cookie中存儲歷史記錄的建議

我正在製作一個網站(PHP),給用戶一個隨機電影標題。他們可以通過用無線電按鈕填寫一個簡單的表單來選擇獲得隨機動作電影,驚悚片等。

我需要一些方法來確保如果用戶已經提供「泰坦尼克號」,它將不會在X天內顯示。

我曾考慮過將用戶提供的電影列表存儲爲設置爲4天的cookie。問題是,如果列表中有一部電影在1天內過期,並且我用「泰坦尼克號」更新列表,那麼列表中的所有電影都會再次等待4天。 每個用戶都會產生很多隨機標題,所以我想將每個標題存儲爲一個cookie不是一個解決方案。

如何做到這一點的任何建議?

+0

你使用數據庫來存儲用戶名/電影標題嗎? – verbumSapienti

回答

0

我假設你已經有一個MySQL數據庫,用來存儲用戶的詳細信息,如用戶名和密碼。

在數據庫中的users表中,您可以添加一個字段,如movies,其中包含電影列表。這些必須是唯一可識別的(如果您還沒有這樣做,我會建議在數據庫中創建一個movies表),並且由於某些電影共享相同的名稱,因此需要爲電影實現ID(即主鍵)。

movies表將是這個樣子:

id 
name 
year 

與示例值:

10102 
Titanic 
1999 

users表是這樣的:

name 
password 
movies 

與示例值:

user123 
pw321 
10001+21/05/2013,24468+19/02/2013,24005+20/04/2013,34339+18/04/2013 

這五位數字與存儲在movies表中的電影的主鍵相關,日期是插入時的時間戳。

在PHP然後你可以加倍explode()movies字符串中的users表,並在你的OP提及的日期比較X的值。比較的結果可能是,從字面上:

X = 4

IF movies.id等於$explodedData[0],並顯示給用戶的多個X天前

然後刪除其條目(可能使用str_replace() ?)從users.movies(從而顯示該電影)

ELSE不隨$explodedData[0]

的ID顯示電影的

我希望這是有道理的。

+0

謝謝!我將爲註冊用戶使用此解決方案。此功能也適用於未註冊的人員。有沒有解決這個問題的好方法? –

+0

我想不出有什麼辦法可以爲未註冊的用戶實現這一點。像其他人說的一樣,cookie可以被重置/刪除/清除/刷新,甚至可以被外部源修改。你甚至不能使用IP地址,因爲無論如何,大多數都是動態的。 – verbumSapienti

0

更好的解決方案是在數據庫中存儲哪些電影之前提供給每個用戶(我不知道是否需要保持登錄才能使用您的應用程序)。

此外,存在cookie解決方案的另一個問題,如果你把大量的內容,你可以達到每個瀏覽器接受的大小限制或cookie的數量(例如IE http://support.microsoft.com/kb/306070)。

0

最好是指定一個數據庫來解決這個問題......使用cookies存在問題,例如。 該用戶刪除所有的互聯網歷史記錄/ cookies /活動登錄所有的日誌記錄/報告將毫無用處。

數據庫更可靠,因爲它只會在您需要時纔會被清除。不在用戶請求上。

0

無論您在哪裏存儲「已經看過」列表 - 數據庫或直接在cookie中 - 您都需要將不同的到期時間與列表中的每部影片關聯起來。因此,當您向列表添加新電影時,其到期時間將從現在開始4天,但這不會影響2天前泰坦尼克號的到期時間。

如果你做到這一點作爲一個cookie,你可以保持在一個關聯數組的電影名單:

$seen[] = array('Titanic' -> $expire_time); // Add movie to seen list 

然後你就可以序列化時,把它cookie中的數組:

setcookie("already_seen", serialize($seen), ...); 

當頁面再次啓動時,你得到的名單:

$seen = isset($_COOKIE['already_seen']) ? unserialize($_COOKIE['already_seen']) : array(); 
0

我會同意,一個DB竟被方法d是最好的,有另一個表UserID,MovieIDMoviePresentedAt datetime。 然後,您可以設置一項作業,每天運行並刪除舊的不相關條目。

相關問題