2011-06-16 60 views
9

我已經寫了一個自定義論壇腳本使用PHP。我決定不使用phpbb和其他人,因爲我希望100%的靈活性與我正在做的事情。自定義PHP論壇 - 顯示新/未讀帖子

我雖然打了一個問題:

如何顯示用戶如果一個職位是新/未讀或不。

兩種解決方案進入腦海:

1)餅乾 2)數據庫

我不想使用cookies,因爲它們可以由用戶和事物的Firefox的一側被刪除意味着他們自動刪除。無論哪種方式,我不想使用cookie。

數據庫引起了我一個問題,因爲我似乎無法讓我的頭排序的數據庫結構!我能想到的第一個解決方案是:

  • 當用戶加載的論壇時,檢查它們加載的論壇了
  • 檢查所有的職位已經進行了自上次看論壇的最後一次
  • 在包含字段(user_id,post_id)的表中將這些值輸入到數據庫中。
  • 該值,然後從數據庫中刪除時,他們查看後

我想這個是它是一個龐大的數據庫漏的問題。看起來效率不高。我確定在字段中有數組的方法,但我對數組並不是很擅長。

誰能給我一個很好的數據庫設計的過程,以及有去與它的任何代碼的指示?這讓我瘋狂,因爲我無法想到一個對服務器來說很好並且高效的解決方案。

非常感謝您的幫助和幫助,

詹姆斯。

+0

只需添加一列即可將布爾值添加到帖子表中,如果已查看,則將其設置爲true,如果尚未查看,則設爲false – 2011-06-16 16:07:47

+1

您可以比較現有電路板軟件如何執行此操作。例如PHPBB或MyBB或其他各種代碼可以免費使用。然後選擇適合您的需求。 – hakre 2011-06-16 16:08:21

+0

我毫不猶豫地發表了這個建議,但我正在考慮和你一樣做,然後我落在了Vanilla論壇上,這個論壇提供的內容非常精簡,並且可以隨時隨地插入你需要的各種位。就像哈克雷所暗示的那樣,即使你不採用它,你也可能會比檢查它們是如何做的更糟糕。 – Cups 2011-06-16 16:42:23

回答

11

這是某種一個很好的問題,我以前從來沒有經歷過這個,所以我只能建議你的想法中,我不知道它的正確性的保證。

我的想法主要是:

  1. 創建一個新的領域,被稱爲is_new主題表格內。該字段包含字符串形式的值列表,遵循特定模式。例如:5|6|12|110|2|45。介於|之間的每個值表示已閱讀主題的用戶ID。

  2. 用戶每次跳進了一個論壇,同時獲取返回的主題列表,你會檢查每個主題由用戶讀取,通過簡單:

    • 使用爆炸字符串中is_newexplode('|', $row['is_new']);
    • 現在你有一個數組包含值,只需要檢查in_array($user['id'], $list_of_ids);
  3. 如果false,紀念主題unread,否則標記爲read,並將該用戶的ID更新到is_new列表中。

這種做法似乎比你原來的做法少「痛苦」,因爲它只比普通的進一步檢查,並且同時爲你獲取的主題列表。如果你有大量的用戶,我認爲它會影響更多。

注意:因爲is_new包含多個值,所以您不必擔心規範化問題,因爲您只使用它來檢查和更新,不需要進行選擇。

此外,用戶也可檢查的主題是新的或不使用的時間比較。例如,如果一個話題持續4周,而用戶沒有閱讀,那麼即使它沒有被閱讀,它也會返回老的(這是否有道理?就像報紙一樣)。我認爲你將能夠做到這一點,確實很容易。

這種方法特別是相當多的論壇軟件應用,因爲它是快速和更有意義。請記住,瀏覽器最初支持您確定已讀/未讀主題,即如果訪問該主題的超鏈接的顏色將被更改。現在又回到了Cookies解決方案。我不會擔心用戶刪除他們的cookies。這種情況很少發生,用戶不會因爲read主題在刪除Cookie後將其轉爲unread而死亡。

相當開放式的話題,不是嗎?希望這有助於(:

+1

@BeingSimpler,加一!很好的答案! – hypervisor666 2011-06-16 18:07:26

+1

這當然是一種有效的方法,但is_new專欄讓我感覺有點骯髒。雖然你的規範化觀點在技術上是正確的,但仍然有一個很好的理由將此信息分解到另一個表中:與JOIN相比,執行字符串爆炸,數組遍歷和可能的數組更新非常慢。關係數據庫的構建是爲了快速有效地關聯這種類型的信息,爲什麼不利用它呢? – 2011-06-17 21:43:12

+0

賈斯汀,好點的(:但是我仍然認爲在這種情況下,它不會影響太大,因爲更新新的ID就像追加一個新的字符串到當前字符串,像「UPDATE主題集is_new = CONCAT(is_new,'| $ id')「。正如我所說,這個字段作爲一個獨立的存儲來匹配值,它不需要與任何其他字段相關,也不需要任何特定的選擇。你的方法是正確的,它甚至聽起來真實的我,但它是從我的思想和方法不同。煤礦發生可能是兩行代碼,並答覆不會減慢那麼多比使用原始RDB apporach。 – 2011-06-17 23:58:35

0

會話將存儲這個的好地方。我想你只想存儲用戶查看的最後「n」個線程的數據,或者僅存儲最後「n」天的線程的數據。

正如有人在它的值得看的一些現有論壇在那裏評論的人提出,看看他們是如何實現這一點。

雖然我認爲這是一個很好的學習機會,在構建它的效率而言寫自己的論壇軟件自己,我認爲你正在重新發明輪子一些。

+0

會話的問題是我不得不使用數組來做到這一點嗎?那麼,如果該人關閉瀏覽器會發生什麼?他們仍然會擁有以前沒有閱讀過的新帖子,即使他們是新手,他們也不會再被顯示爲「新」。 使用數據庫的好處是,即使關閉瀏覽器,帖子始終保持爲「新」,因爲在讀取該值之前,該值保持「未讀」狀態。 我同意我「重新發明輪子」可以這麼說,但我厭倦了試圖修改其他人的編碼以使其適用於我。它只是不工作.. – James 2011-06-16 16:18:25

+0

不能使用數組將會限制您構建功能的能力。我真的建議投資一些時間來了解它。有一堆很好的教程,只需搜索「PHP陣列」Google – 2011-06-16 16:21:14

+0

感謝您的建議。關於我在會議上提出的觀點,你會對此提出什麼建議?如果他們通過查看新帖子來關閉瀏覽器,如果他們稍後再回來會發生什麼情況? 我將嘗試加載phpbb論壇代碼,看看他們如何顯示新帖子。我不確定是否有可能找到它..但我會嘗試! :) 如果你在數據庫方面的任何想法,一定要讓我知道:)謝謝 – James 2011-06-16 16:24:02

1

嗯,好問題

我會折騰我的兩分錢在我將如何處理這個問題,它可能不是最有效的解決方案,但在這裏有雲:

我將使用數據庫來解決這個問題,如果可能的話,在數據庫中創建一個附加到特定用戶的字段,在該字段內(或者列或表,如果您願意的話)可以存儲文章ID的「已查看」文章列表

呈現給用戶的頁面時,找回自己的「觀察」的文章列表,所有的物品ID的可用的列表。

遍歷你的文章/論壇/主題結果集,看看是否ID匹配任何的「看」的ID。對於沒有相應的「查看」匹配的每篇文章/論壇/主題條目,則對於該用戶而言,它將是「新」文章。

這是處理器/數據庫/網絡密集型的,需要每個頁面加載時間,其中包含引用的文章中查找到數據庫中。儘管有一些聰明的查詢設計,我認爲你可以將這種操作幾乎完全卸載到數據庫。

另一個使用數據庫的潛在解決方案是,當用戶首次登錄網站時,您可以在第一個加載點獲取已讀文章/論壇列表,並將其添加到cookie或會話中,這樣您只需在第一次加載時就爲該列表命中數據庫,並將其存儲在session/cookie/hidden字段中,以便在隨後的請求中,您只需轉到該cookie/session/hidden字段而不是執行Db每次用戶查看包含文章/論壇/主題列表的頁面時都要查找。每次用戶點擊一個鏈接時,捕獲並將其存儲在數據庫中,並將該文章/論壇ID存儲在cookie/session/hidden字段中。再一次,也許不是最有效的方法,但有一些好的老式消費,我相信你會佔上風。 :)

祝你好運!

^h

5

很多大論壇軟件的使用跟蹤表跟上誰讀過什麼,像這樣(嚴重簡化):

CREATE TABLE topic_tracking (
    user_id INT NOT NULL, 
    topic_id INT NOT NULL, 
    last_visit DATETIME NOT NULL, 
    PRIMARY KEY (user_id, topic_id) 
) 

然後,您使用連接上此表格檢查您顯示的帖子是否被讀取。既然你會分頁你的線程,這應該會產生相對較少的附加查詢(取決於你每頁顯示多少篇文章)。

當用戶訪問該線程時,使用其訪問的時間戳更新此跟蹤表。然後,當顯示您的線索鏈接時,請檢查此表以查看他們的last_visit是否早於線索中的最後一個帖子。這也可以讓你顯示「更新」的線程,而不僅僅是「新」的線程。

0

我的做法是,以節省每一個主題特定的用戶數據庫中已經看到的最後一個職位編號:

user_id topic_id post_id 
1   2   3 

所以,在這裏,你知道,用戶1對第二個專題走訪後第三,但根本沒有看第一個話題。

要檢查用戶是否有新/未讀主題,您可以首先檢查該用戶不在該表中的topic_id。要檢查已知主題是否有新消息,可以將post_id與每個主題的最後一個post_id進行比較。如果不相等,則會有新消息。