2012-05-10 18 views
3

Я хочу создать простое управление учетными записями на основе PHP и MySQL. Мне нужно отслеживать определенные типы учетных записей пользователей и длину подписки. Я хочу, чтобы пользователь мог выбрать «пакет подписки» (бронза, серебро, золото) и время (одна неделя, один месяц, год), он хочет, чтобы его подписка продолжалась.Управление учетными записями с помощью PHP и MySQL, добавление Timespan?

Однако более высокие номинальные подписки (золото> серебро> бронза) должны иметь приоритет над более низкими номинальными. Это означает, что если у пользователя должна быть как серебряная, так и золотая подписка, то время, затрачиваемое на золотую подписку, очевидно, должно быть использовано в первую очередь, и только когда оно закончилось, следует использовать серебряный.

Для сохранения подписки внутри, я создал таблицу:

INT id 
INT user_id 
INT type 
DATETIME start 
DATETIME end 

Мой вопрос: Как я могу узнать, если учетная запись пользователя имеет действующую подписку на определенный момент времени и какой тип, что подписка является? Самое главное, мне было бы интересно, как динамически добавлять дополнительные подписки, когда уже существует одна подписка на runnnig.

Более точный пример:

  • пользователь покупает 5 дней бронзы в день 1 -> Подписка на "бронзу" работает с первого дня 1-5.
  • на 2-й день пользователь решает, что хочет «серебро» дополнительно и покупает еще 5 дней с этого
  • ситуация сейчас: бронза (день 1), серебро (дни 2-6), бронза (дни 7-10)

Предпочтительно, я хотел бы выполнить большую часть работы внутри MySQL-запроса, но я не уверен, что это вообще возможно. Если все остальное не удастся, мне придется вернуться к PHP.

Спасибо за ваше время!

ответ

2

Во-первых, чтобы найти текущие действительные подписки, ваш запрос должен быть построен как:

$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); } 
+0

Большое спасибо за этот ответ! Извините, что не сообщал ранее, но я попробую в эти выходные и дам вам отзывы :) – Weaz

Смежные вопросы