PHP / MysQl以月 - 日 - 小时限制用户帖子

时间:2016-04-15 02:44:24

标签: php mysql

我正在开发一个PHP脚本,我有一个管理控制面板来添加用户,我需要添加一些选项,如用户每月帖子 - 用户每日帖子 - 用户每小时帖子,让我们说我设置用户每月发布到30,用户每日发布为10,用户每小时发布为5,即:

用户每月只能发布5个帖子,每月发布10个帖子,每月30个帖子限制,如果用户每月发帖,他就无法在本月和下个月添加帖子我想要自动添加另外30个帖子!!

我的用户表名是(用户):

`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`monthly` int(2) unsigned NOT NULL,
`daily` int(10) unsigned NOT NULL,
`hourly` int(10) unsigned NOT NULL,

我的帖子名称是user_post

  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `created_dt` datetime NOT NULL,
  `user` int(10) unsigned NOT NULL,

我需要知道:

  1. 如果我使用30个月的帖子限制注册用户,如何将每月用户列每月更新为30个。
  2. 当用户登录并希望发帖时,如何检查他是否还有更多每月,每日,每小时的帖子!
  3. 任何人都可以帮我看看我能做到这一点,谢谢你的朋友们

3 个答案:

答案 0 :(得分:0)

在插入帖子之前,您可以运行类似此查询的查询来查找每小时,每日和每月的帖子,并在代码中检查并决定允许/不允许用户添加帖子。 在不了解您的架构的情况下,我刚为您的帖子表中的列创建了一些可能的名称当然,您的用户ID(1)应该替换为您试图阻止添加帖子的用户的用户ID。

SELECT SUM(CASE WHEN created_at > CURRENT_TIMESTAMP() - INTERVAL 1 HOUR THEN 1
           ELSE 0
           END) AS hourly_posts,
       SUM(CASE WHEN created_at > CURRENT_TIMESTAMP() - INTERVAL 1 DAY THEN 1
           ELSE 0
           END) AS daily_posts,
       SUM(CASE WHEN created_at > CURRENT_TIMESTAMP() - INTERVAL 1 MONTH THEN 1
           ELSE 0
           END) AS monthly_posts   
FROM posts
WHERE userid = 1

答案 1 :(得分:0)

在“用户帖子”表格中添加“发布日期时间”列。对于这个例子,我们将调用新列`created_dt`(使用DATETIME的dataype。我们还假设表的名称是`user_post`。

插入行时,使用当前日期和时间填充新列。

当用户尝试发布另一行时,您可以检查是否已超出任何限制。

select s1.empid, s1.qtr, s1.salary
from s1 right other join
((select distinct empid from s1) s3 cross join s2) t
on s1.empid = t.empid and s1.qtr = t.qtr

然后,您可以将返回的值与用户的限制进行比较,以查看是否已超出任何限制,或者如果添加了其他帖子则会超出限制。

为了获得此查询的最佳性能,您需要一个索引

 SELECT SUM(1)                                        AS cnt_past_month
      , SUM(p.created_dt >= NOW() + INTERVAL -7 DAY)  AS cnt_past_week
      , SUM(p.created_dt >= NOW() + INTERVAL -1 HOUR) AS cnt_past_hour
   FROM user_post p
  WHERE p.user_id = ?
    AND p.created_dt >= NOW() - INTERVAL 1 MONTH

您可以在查询中获得用户的限制......

ON user_post(userid, created_dt) 

使用这种方法,您不需要一堆不必要的DML来增加计数器和重置计数器。您对用户限制所做的任何更改都可能立即生效。

您可以使用值“0”来指定“无限制”。您进行比较的逻辑需要考虑到这一点。

我就是这样做的。

我还可以将计数与查询本身的限制进行比较,返回“剩余的帖子数”,直到超出限制。

SELECT q.count_past_month
     , m.limit_past_month
     , q.count_past_week
     , m.limit_past_week
     , q.count_past_hour
     , m.limit_past_hour
  FROM ( SELECT p.userid
              , SUM(1)                                       AS cnt_past_month
              , SUM(p.created_dt >= NOW() - INTERVAL 7 DAY)  AS cnt_past_week
              , SUM(p.created_dt >= NOW() - INTERVAL 1 HOUR) AS cnt_past_hour
           FROM user_post p 
          WHERE p.user_id = ?
            AND p.created_dt >= NOW() - INTERVAL 1 MONTH
       ) q
  CROSS
   JOIN ( SELECT MIN(l.limit_per_month)
               , MIN(l.limit_per_week)
               , MIN(l.limit_per_hour)
            FROM user_limit l
           WHERE l.user_id = ?
        ) m

需要制定“禁令”(不允许发布职位)和“无限制”(职位无限制)的机制。例如,使用0表示禁止,使用NULL表示“无限制”。

有了这个,我们就知道当查询返回一个值小于或等于零的列时,就意味着超出了一个限制(或者将被另一个帖子超过。)所有其他值(NULL列中的正整数)表示允许“下一篇文章”。

答案 2 :(得分:0)

我已更新Tin Tran的代码:

SELECT SUM(CASE WHEN (created_at > CURRENT_TIMESTAMP() - INTERVAL 1 HOUR) and date_format(CURRENT_TIMESTAMP(),'%H') = date_format(created_at,'%H')) THEN 1
           ELSE 0
           END) AS hourly_posts,
       SUM(CASE WHEN (created_at > CURRENT_TIMESTAMP() - INTERVAL 1 DAY and date_format(CURRENT_TIMESTAMP(),'%D') = date_format(created_at,'%D')) THEN 1
           ELSE 0
           END) AS daily_posts,
       SUM(CASE WHEN (created_at > CURRENT_TIMESTAMP() - INTERVAL 1 MONTH and date_format(CURRENT_TIMESTAMP(),'%m') = date_format(created_at,'%m')) THEN 1
       ELSE 0
       END) AS monthly_posts   
FROM posts
WHERE userid = 1