簡體   English   中英

如何為每一天使用 PHP 和 MYSQL 創建視圖計數器?

[英]How to create view counter with PHP and MYSQL for every new day?

我目前正在 PHP 中編寫自己的 CMS 系統。

帖子的所有視圖每天都應存儲在 MySQL 數據庫中。

目前我有一個視圖計數器,它將帖子的所有帖子視圖存儲在帖子表中。

$article_id = $_GET['p_id'];

// article view counter
$view_query = "UPDATE articles SET article_views_count = article_views_count + 1 WHERE article_id = $article_id ";
$send_query = mysqli_query($connection, $view_query);

現在我想改變整個事情,每天每個帖子都會在單獨的表格中創建一個新條目。

我已經學會了如何做這一切,但我當前的 SQL 命令每次調用時都會在表中添加一個新條目,而不是一整天。

新的 SQL 命令:

INSERT INTO days_views (`article_id`, `day_views_count`, `day`) VALUES (1, 1, CURDATE()) ON DUPLICATE KEY UPDATE `day_views_count` = `day_views_count` + 1;
CREATE TABLE `days_views` (
  `day_views_id` int(11) NOT NULL,
  `article_id` int(11) NOT NULL,
  `day_views_count` int(255) NOT NULL,
  `day` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_german2_ci;

ALTER TABLE `days_views`
  ADD PRIMARY KEY (`day_views_id`);

ALTER TABLE `days_views`
  MODIFY `day_views_id` int(11) NOT NULL AUTO_INCREMENT;

我目前的測試表

如何每天為每個帖子添加一行?

我如何計算一整天的觀看次數?

更改表定義以使用article_idday作為主鍵。

CREATE TABLE `days_views` (
  `article_id` int(11) NOT NULL,
  `day` date NOT NULL,
  `day_views_count` int(255) NOT NULL,
  PRIMARY KEY (`article_id`, `day`),
  CONSTRAINT `article` FOREIGN KEY (`article_id`) REFERENCES `articles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_german2_ci;

然后使用 UPSERT 語句遞增:

INSERT INTO days_views (`article_id`, `day`, `day_views_count`)
VALUES (<article_id>, CURDATE(), 1) 
ON DUPLICATE KEY UPDATE day_views_count = day_views_count + 1;

您的主鍵必須是day_views_idarticle_id的組合鍵,而不僅僅是day_views_id

ALTER TABLE `days_views` ADD UNIQUE `CompKey` (`day_views_id`, `article_id`);

添加唯一索引后,您現有的邏輯將起作用。 請注意有關 SQL 注入的評論。

以不同的方式思考可能是個好主意。 我將嘗試解釋:

1. 如何每天為每個帖子添加一行?

您可以為每個視圖提示進行插入,以保存以下內容:

  • day_views_id
  • article_id
  • day(必須是 DateTime 或 timestamp 類型,您將在 PHP 中更好地操作它)

這樣,您每天為每個帖子添加一行

2. 如何計算全天的瀏覽量?

很簡單,你可以做一個count(); 具有特定 article_id 的行數,日期時間字段 = NOW(); . 這將返回特定日期特定文章的總瀏覽量。

添加session id並將其存儲到表中的每個插入可能是一個好主意。

我希望我有所幫助。

暫無
暫無

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

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