4

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

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

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

INT id
INT user_id
INT type
DATETIME start
DATETIME end

我的问题是:如何确定用户帐户在某个时间点是否有有效的订阅以及该订阅的类型?最重要的是,当已经有一个订阅正在运行时,我会对如何动态添加更多订阅感兴趣。

更精确的例子:

  • 用户在第 1 天购买了 5 天的青铜 -> 订阅“青铜”从第 1 天到第 5 天运行。
  • 在第 2 天,用户决定他想要额外的“银”并再购买 5 天
  • 现在的情况:铜牌(第 1 天)、银牌(第 2-6 天)、铜牌(第 7-10 天)

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

谢谢你的时间!

4

1 回答 1

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); }
于 2012-05-10T16:14:13.323 回答