PHP: Как подойти к обновлению членов Auto Premium?

StackOverflow https://stackoverflow.com/questions/2036356

  •  19-09-2019
  •  | 
  •  

Вопрос

Сценарий:

Есть 4 предмета:

30day pass
60day pass
180day pass
365day pass

Есть ежемесячный (30 -дневный) кредитный каплей. Поэтому, если вы используете кредит до конца месяца, вам нужно купить еще один 30 -дневной проход или подождать до следующего периода продления.

Человек покупает 30 -дневный проход сегодня, дата покупки записывается в DB. Дата истечения также записана.

if ($todaysdate >= $expirydate) //DONE. 

Но как насчет проходов на 60 дней и 180 дней?

Мы приобрели и истекали дату. Каждые 30 дней кредит должен быть сброшен на следующий месяц.

Я действительно потерян, как лучше всего подходить к этой проблеме.

Это было полезно?

Решение

Вы можете запускать задачу (или задание Cron) ежедневно, чтобы проверить и посмотреть, будет ли текущая дата позже, чем записанная дата истечения срока действия, и если она сбросит кредит пользователей на 0, и отправить им электронное письмо, сообщая им, что их кредит истек Анкет

По мере того, как пользователи покупают кредит, вы просто добавляете 30, 60 или 90 дней к истечению срока действия.

Для получения дополнительной информации см. PHP + Cronjob теги.

Другие советы

Один из способов сделать это с Cron и MySQL

Когда вы запускаете этот крон каждый день

Определите переменную

define (DAY_AMOUNT ,30);

Проверьте проход на день по запросу

SELECT mem_id  DATEDIFF(CURDATE(),mem_date) AS daypass FROM table
 WHERE ((DATEDIFF(CURDATE(),mem_date))=".DAY_AMOUNT."

Результаты, которые возвращаются, - это все участники, которые проходят 30 дней с даты.

В вашей ситуации у вас может быть такой стол:

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 (), вы убедитесь, что кредит будет сброшен только после истечения срока действия. Поскольку вы помните, какие проходы были промыты, вы можете запустить это так часто, как вам нравится, и пропустить день не является проблемой (это будет обнаружено при следующем пробеге).

Это фактически так, как будет работать визитная карточка с предоплатой - у вас есть определенное количество минут, которые действительны для X (30/60/90, что угодно), и минуты сброшены в конце.

Кстати, вы можете упростить все эти вещи, используя простую в использовании систему управления подпиской, например нестандартно или же Зарядка.

Или, в базе данных, вы можете сохранить каждый человек, имея свой собственный срок действия истечения.

Чтобы сделать дату истечения, вы должны использовать временную метку UNIX. 30 дней - это 2592000, поэтому, чтобы найти дату истечения, вы можете использовать что -то вроде следующего, если хотите рассчитать дату истечения срока действия (меняя месяцы с сколько месяцев).

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

Затем поместите эти значения в базу данных.

Затем вы можете сделать что -то, что выполняет автоматизированную задачу (например, Cron).

Когда вы запускаете эту автоматизированную задачу, вы проверяете, является ли текущая временная метка (другое слово для времени) больше, чем дата истечения. Если это так, то измените значение в базе данных в поле, если они имеют правильные кредиты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top