3

设想:

有4个项目:

30day pass
60day pass
180day pass
365day pass

有一个每月(30 天)的信用上限。所以如果你在月底之前用完积分,你需要再购买一个 30 天的通行证,或者等到下一个续订期。

一个人今天购买了 30 天的通行证,购买日期记录到 DB。到期日也被记录下来。

if ($todaysdate >= $expirydate) //DONE. 

但是 60 天和 180 天的通行证呢?

我们已经购买了日期和到期日。每 30 天,下个月需要重置信用额度。

我真的迷失了如何最好地解决这个问题。

4

4 回答 4

1

一种方法是使用 cron 和 mysql

当你每天运行这个 cron

定义一个变量

define (DAY_AMOUNT ,30);

通过查询查询当日通行证

SELECT mem_id  DATEDIFF(CURDATE(),mem_date) AS daypass FROM table
 WHERE ((DATEDIFF(CURDATE(),mem_date))=".DAY_AMOUNT."

返回的结果是从日期起经过 30 天的所有成员。

于 2010-01-10T06:55:30.377 回答
0

您可以每天运行一个任务(或 cron 作业)来检查当前日期是否晚于记录的到期日期,以及是否将用户信用重置为 0,并向他们发送一封电子邮件,让他们知道他们的信用已过期.

当用户购买信用时,您只需将其到期日期增加 30、60 或 90 天。

有关详细信息,请参阅php + cronjob标记。

于 2010-01-10T06:43:36.977 回答
0

在您的情况下,您可以有这样的表格:

pass: (id, user_id, start_time, end_time, credit)

每天,您都可以在任何过期的通行证上刷新未使用的信用:

update user join
  (select user_id, sum(credit) as credit from pass
    group by user_id where end_time <= now() and not flushed) b
  set user.credit = max(user.credit - b.credit, 0)
  where user.user_id = b.user_id

update pass set flushed = 1 where end_time <= now() and not flushed

通过使用 end_time <= now() 您可以确保仅在到期日期过后才重置信用。由于您记得哪些通道被刷新,您可以随意运行它,并且错过一天不是问题(它将在下一次运行时检测到)。

这实际上是预付费电话卡的工作方式 - 您有一定数量的分钟数,有效期为 X(30/60/90 天),最后会重置分钟数。

顺便说一句,您可以使用易于使用的订阅管理系统(如recurlychargify )来简化所有这些工作。

于 2010-01-10T06:45:27.357 回答
0

或者,在数据库中,您可以保存每个人都有自己的有效期。

要确定到期日期,您应该使用 unix 时间戳。30 天是 2592000 因此要找到到期日期,如果要计算到期日期(用多少个月更改月份),您可以使用类似以下的内容。

$months = 2; $expiry_date = time() + 2529000*$months;

然后,将这些值放入数据库。

然后,您可以执行一些自动化任务(例如,cron)。

When you run that automated task, you check if the current timestamp (another word for time) is bigger then the expiry date. If so, then change the value in the database in the field for if they have the right credits.

于 2010-01-10T08:24:31.867 回答