基于订阅的PHP和MySQL帐户管理,Timespan新增功能?

我想在
PHP和MySQL驱动的网站上创建一个简单的基于订阅的帐户管理.我需要跟踪某些类型的用户帐户和订阅的长度.我希望用户能够选择“订阅包”(铜牌,银牌,金牌)以及他希望他的订阅持续的时间跨度(一周,一个月,一年).

但是,较高评级的订阅(金牌>银牌>铜牌)应优先于较低评级的订阅.这意味着,如果用户同时拥有白银和黄金订阅,那么黄金订阅的时间跨度显然应首先使用,并且只有在用完之后才能使用白银订阅.

为了在内部存储订阅,我创建了一个表:

INT id
INT user_id
INT type
DATETIME start
DATETIME end

我的问题是:如何确定用户帐户在某个特定时刻是否具有有效订阅以及该订阅的类型是什么?最重要的是,当有一个订阅runnnig时,我会对如何动态添加更多订阅感兴趣.

更精确的例子:

>用户在第1天购买5天的青铜 – >订阅“铜牌”从第1-5天开始.
>在第2天,用户决定另外要“银”并再购买5天
>现在的情况:青铜(第1天),银(第2-6天),青铜(第7-10天)

最好,我想在MySQL查询中完成大部分工作,但我不确定这是否可行.如果一切都失败了,我将不得不回归PHP.

谢谢你的时间!

最佳答案 首先,要查找当前有效的订阅,您的查询应构造如下:

$query = "SELECT * ".
         "FROM subscriptions_table ".
         "WHERE user_id = $user_id ".
         "  AND start < '" . date("Y-m-d") ." 23:59:59' ".
         "  AND end > '" . date("Y-m-d") ." 00:00:00' ".
         "ORDER BY type";
$results = mysql_query($query);

这将为您提供订阅的每日粒度.如果你想要它只是分钟,然后取出时间并将日期格式调整为日期(“Y-m-d H:i:s”)

此处的结果将是此用户的订阅数组,其中最高类型为第一个.要评估要显示的层,您可以使用第一个结果,您可以通过$subscriptionRow = mysql_fetch_array($results)找到;

当购买发生时,你将不得不做更多.基本上,遍历每个现有订阅并相应地调整时间.在此代码之前,请确保您没有使用上面的$subscriptionRow赋值:

$adjustmentQueries = array();
while ($subscriptionRow = mysql_fetch_array($results))
{
   if ($subscriptionRow['type'] > $purchaseType) { } //do nothing
   else
   {
      $newDate = date("Y-m-d H:i:s", strtotime("+".$intNumDaysPurchased." days", strtotime($subscriptionRow['end'])));
      $adjustmentQueries[] = "UPDATE subscriptions_table SET end = '$newEndDate' WHERE id=$subscriptionRow['id']";
   }
}

foreach ($adjustmentQueries as $adjQuery) { mysql_query($adjQuery); }
点赞