簡體   English   中英

如何從PHP中的MySQL數據庫中提取“今日特色文章”?

[英]How can I make a 'Today's featured article' extraction from a MySQL DataBase in PHP?

如何使用PHPMySQL制作“今日精選文章”系統?

每天,當用戶第一次訪問該站點時,我需要從數據庫中隨機選擇一篇文章,並且這將在一天中用於訪問該站點的每個用戶。 這將在沒有管理員干預的情況下發生,因此腳本將由訪問的用戶觸發。

根據我的理解,用戶第一次在新的一天訪問該頁面時,該腳本會隨機(或在其他基礎上)選擇一篇文章,然后在數據庫中將其標記,同時將文章從之前的文章中解放出來天。 但是,如果兩個用戶同時訪問同一頁面怎么辦? 這可能意味着會同時標出兩篇文章!

你如何應對時區?

我會做的是:

然后,當訪問者訪問該站點時,他們的頁面視圖只從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;

注意:

  • $ id不一定是article.id,而是第N篇文章。
  • 您可以通過更改日期格式來更改文章更改的頻率。 如果你想每小時更改一次,只需輸入: date('H')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM