4

PHPおよびMySQL主導のWebサイトで単純なサブスクリプションベースのアカウント管理を作成したいと思います。特定の種類のユーザーアカウントとサブスクリプションの長さを追跡する必要があります。ユーザーが「サブスクリプションパッケージ」(ブロンズ、シルバー、ゴールド)と、サブスクリプションを継続する期間(1週間、1か月、1年)を選択できるようにしたいと思います。

ただし、評価の高いサブスクリプション(ゴールド>シルバー>ブロンズ)は、評価の低いサブスクリプションよりも優先する必要があります。つまり、ユーザーがシルバーとゴールドの両方のサブスクリプションを持っている必要がある場合は、ゴールドサブスクリプションの期間を最初に使用する必要があり、シルバーサブスクリプションを使用する必要があるのは、それがなくなったときだけです。

サブスクリプションを内部に保存するために、次のテーブルを作成しました。

INT id
INT user_id
INT type
DATETIME start
DATETIME end

私の質問は、ユーザーアカウントが特定の時点で有効なサブスクリプションを持っているかどうか、およびそのサブスクリプションがどのタイプであるかを確認するにはどうすればよいですか?最も重要なのは、サブスクリプションがすでに1つ実行されているときに、サブスクリプションを動的に追加する方法に興味があることです。

より正確な例:

  • ユーザーは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 に答える