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

これを行う 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

または、データベースで、各人が独自の有効期限を持っていることを保存できます。

有効期限を設定するには、UNIXタイムスタンプを使用する必要があります。30日は2592000なので、有効期限を計算する場合は、次のようなものを使用できます(月と月数の変更)。

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

次に、それらの値をデータベースに入れます。

次に、自動化されたタスクを実行する何かを実行できます(たとえば、cron)。

その自動化されたタスクを実行するときは、現在のタイムスタンプ(時間の別の単語)が有効期限よりも大きいかどうかを確認します。その場合は、データベースの値をフィールドで変更して、適切なクレジットがあるかどうかを確認します。

于 2010-01-10T08:24:31.867 に答える
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() を使用すると、有効期限が過ぎた場合にのみクレジットがリセットされるようになります。どのパスがフラッシュされたかを覚えているので、これを好きなだけ実行でき、1 日を逃しても問題ありません (次の実行で検出されます)。

これは、プリペイド コーリング カードが効果的に機能する方法です。X (30/60/90) 日間有効な特定の分数があり、分数は最後にリセットされます。

ところで、 recurlychargifyなどの使いやすいサブスクリプション管理システムを使用することで、これらすべてを簡素化できます。

于 2010-01-10T06:45:27.357 に答える