PHP: Как подойти к обновлению членов Auto Premium?
Вопрос
Сценарий:
Есть 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).
Когда вы запускаете эту автоматизированную задачу, вы проверяете, является ли текущая временная метка (другое слово для времени) больше, чем дата истечения. Если это так, то измените значение в базе данных в поле, если они имеют правильные кредиты.