使用PHP&基于订阅的帐户管理MySQL,Timespan补充?

时间:2012-05-10 14:42:36

标签: php mysql account

我想在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。

谢谢你的时间!

1 个答案:

答案 0 :(得分:3)

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

$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);

这将为您提供订阅的每日粒度。如果您希望它缩短到分钟,请取出时间并将日期格式调整为date("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); }