[英]How can I make a 'Today's featured article' extraction from a MySQL DataBase in PHP?
如何使用PHP
和MySQL
制作“今日精選文章”系統?
每天,當用戶第一次訪問該站點時,我需要從數據庫中隨機選擇一篇文章,並且這將在一天中用於訪問該站點的每個用戶。 這將在沒有管理員干預的情況下發生,因此腳本將由訪問的用戶觸發。
根據我的理解,用戶第一次在新的一天訪問該頁面時,該腳本會隨機(或在其他基礎上)選擇一篇文章,然后在數據庫中將其標記,同時將文章從之前的文章中解放出來天。 但是,如果兩個用戶同時訪問同一頁面怎么辦? 這可能意味着會同時標出兩篇文章!
你如何應對時區?
我會做的是:
然后,當訪問者訪問該站點時,他們的頁面視圖只從memcached中提取HTML片段並直接在頁面中輸出。 在午夜,HTML片段以原子方式更改,下一個PHP請求將獲取新保存的文章。
由於cron作業是選擇隨機文章的唯一代碼,因此它不與任何其他代碼同時運行,因此不需要鎖定。
沒有運行memcached? 習慣它。 Web應用程序架構需要一些明智的,特定於應用程序的緩存,而memcached是最佳解決方案。
關於時區,簡短的回答是將UTC用於所有事情。 有關更多細節,請收聽OurSQL播客第46集:關於時間 。
您將需要構建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);
}
這是未經測試的,但它可以讓您了解您想要實現的目標。
你可以通過使用日期來播種散布文章ID的哈希函數,而無需在任何地方保存任何內容。 我不知道我推薦這么做,但無論如何都要考慮替代解決方案。 :)
$id = hexdec(substr(md5(date('Ymd')), 0, 8)) % $number_of_articles;
注意:
date('H')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.