2011-07-29 21 views
1

如何使用PHPMySQL製作'今日特色文章'系統?如何從PHP中的MySQL數據庫中提取'今日精選文章'?

每一天,用戶第一次訪問該網站時,我需要從數據庫中隨機選擇一篇文章,這將用於整個一天,爲每個來到該網站的用戶。 這會在沒有任何管理員介入的情況下發生,因此腳本將由訪問的用戶觸發。

據我瞭解,用戶第一次在新的一天訪問該頁面時,該腳本會隨機(或以其他方式)選擇一篇文章,然後在數據庫中將其標記,同時不放棄來自前一天的文章。但是如果兩個用戶同時訪問同一頁面呢?這可能意味着將有兩篇文章在同一時間被標記!

你如何應對時區?

+0

節省你自己的一些努力。它不是任務關鍵;只需將它存儲在一個cookie中。如果他們改變PC,那麼它會失去哪個故事,但這很重要嗎? – Treffynnon

+0

@Treffynnon:所有用戶共享一個cookie? –

+0

@ TomalakGeret'kal這就是爲什麼這是一個評論,而不是答案!如果不是那麼重要,爲什麼它會複雜化。 – Treffynnon

回答

0

您將需要構建2個數據庫。一個有明顯的新聞文章,另一個持有該特定日期的文章ID。您可以在加載站點時檢查PHP中的支票,以檢查當前日期以及是否存在文章。如果沒有,用戶是第一個到達該網站,因此找到隨機文章,並將其與白天的文章插入到表中。

我不會爲你寫整個腳本,但我會給你幾個元素。至於時區,您將使用服務器時間而不是最終用戶的計算機時間。這是違反安全性的,因爲它們可能會在將來或過去設定一個日期,而不是編寫任何數據。

對於在「同一時間」訪問該網站的用戶來說,這是不太可能的。

對於從MySQL數據庫按日期選擇文章中,你可以使用:

$check_sql = "SELECT * FROM todays_article 
      WHERE date = '" . date("j-n-Y") . "' 
      LIMIT 1"; 
$check_qry = mysql_query ($sql); 
if (mysql_num_rows ($check_qry) == 1) { 
    // Do nothing 
} 
else { 
    $random_sql = "SELECT article_id FROM articles 
       ORDER BY RAND() LIMIT 1"; 
    $random_qry = mysql_query ($random_sql); 
    $random_row = mysql_fetch_assoc($random_qry); 
    $insert_sql = "INSERT INTO todays_article 
       ('article_id', 'date') VALUES 
       ('" . $random_row["article_id"] . "', '" . date("j-n-Y") . "')"; 
    $insert_qry = mysql_query($insert_sql); 
} 

這是未經測試,但它給你的,你想達到什麼樣的想法。

+0

非常感謝您花時間回答。使用兩個表格的選項並沒有發生在我身上。至於併發性問題,它更多的是一種興趣而不是真正的需求,因爲正如你所說,兩個用戶同時訪問同一個表的機會非常小。 –

4

我會做的是:

然後,當訪問者訪問該網站時,他們的頁面視圖只是從memcached中提取HTML片段並直接在頁面中輸出。午夜時分,HTML片段自動變化,下一個PHP請求獲取新保存的文章。

由於cron作業是選擇隨機文章的唯一代碼,因此它不會與任何其他代碼同時運行,因此不需要鎖定。

未運行memcached?習慣它。 Web應用程序體系結構需要一些明智的,特定於應用程序的緩存,而memcached是最好的解決方案。

關於時區,簡短的答案是使用UTC的一切。欲瞭解更多詳情,請聽OurSQL Podcast episode 46: It's About Time

+0

非常感謝您花時間回答。不幸的是,我不能應用這個,因爲它似乎要運行一個cron作業,我需要直接訪問服務器,這是我沒有的,因爲我使用的是第三方服務器。 –

0

你可以做到這一點,而不必在任何地方保存任何東西,通過使用日期種子散列出文章ID的散列函數。我不知道我會推薦實際做到這一點,但無論如何思考備用解決方案是很有趣的。 :)

$id = hexdec(substr(md5(date('Ymd')), 0, 8)) % $number_of_articles; 

注:

  • $ ID不一定article.id,但第N條。
  • 只需更改日期格式即可更改文章更改的頻率。如果你想每小時更換一次,只需做到:date('H')
+0

感謝您花時間回答。這是一個非常有趣的解決方案,但它確實意味着如果文章數量發生變化(例如添加文章),所選文章ID將發生變化。 –

相關問題