Справочная информация
Я создаю систему пожертвований / покупок для игры garrys mod. когда пользователь жертвует через paypal, у меня есть php-код, который обрабатывает ipn и вводит данные в базу данных, он также генерирует серийный ключ и отправляет его по электронной почте этому пользователю, который затем может ввести это в игру, когда пользователь вводит последовательную игру, которую он проверяет база данных видит, является ли ключ действительным, а затем выполняет соответствующий код lua. Система до сих пор прекрасно работает, однако пакеты пожертвований продолжаются в течение определенного периода времени 30 дней, 90 дней, 180 дней и 365 дней.
То, что я хочу достичь, – это когда пользователь вводит ключ в игру. У меня будет код lua, в котором хранятся идентификаторы паролей игроков, а также день, когда они его выкупили, и как долго будет длиться пакет. я установлю задание cron для запуска скрипта, который проверяет базу данных, если ключ используется, если ключ был использован, он проверяет, может ли, например, прошло 30 дней с тех пор, как они выкупили ключ, если его ниже 30 дней ничего не делают, если в течение 30 дней он изменит значение в таблице от 0 до 1.
Вопрос
Часть, на которой я действительно пытаюсь понять, как сохранить дату и проверить дату, изначально я думал, что буду использовать день в году, но затем приходит вопрос о смене года с 365 до 0, если кто-то покупает это в декабре в течение 90 дней, после чего произойдут ошибки. Итак, как я могу сделать это с надежным учетом изменения года?
Спасибо всем, кто разместил ответы и очень быстро, я думаю, что у меня есть достаточно, чтобы работать сейчас, еще раз спасибо за ваше время
Ну, я не знаю вашу структуру базы данных, но скажем, что это примерно так:
user_table ----------------------------------------- user_id | date_of_redeem | subscription ----------------------------------------- user1 | 2014-02-01 | 90 user2 | 2014-05-18 | 365 user3 | 2014-07-22 | 180
Таким образом, с использованием только SQL-операторов вы можете использовать что-то вроде DATE_SUB. Сравните date_of_redeem с сегодняшней датой минус сумма подписки. Если значение date_of_redeem выше, то вы получите результат, иначе он вернет пустой набор результатов.
SELECT * FROM `user_table` WHERE `date_of_redeem` > DATE_SUB(NOW(), INTERVAL `subscription` DAY) AND `user_id` = 'desired_user_id'
Изменить: SQL Fiddle для вышеуказанного запроса: http://sqlfiddle.com/#!2/f95ea/11 (просто измените user3
на любой из ID пользователя, чтобы проверить, возвращают ли они какие-либо результаты.
если вы хотите получить таблицу со всеми датами истечения срока действия подписки, тогда вы можете сделать что-то вроде этого:
SELECT `user_id` AS `User`, (DATE_ADD(`date_of_redeem`, INTERVAL `subscription` DAY)) AS `Subscription Ends` FROM `user_table`
SQL Fiddle для этого: http://sqlfiddle.com/#!2/f95ea/9
Сначала вы укажете дату, когда пакет истечет. (Это можно сделать с помощью класса DateTime PHP, если это необходимо). Затем вы можете просто сравнить его со time()
$date = new DateTime('2014-01-01'); //purchase date $date->add(new DateInterval('P30D')); //in this case for 30 days if(time() < $date->getTimestamp()) { //expired }
Используйте временную метку Unix . Он сохраняет текущую дату как число. В частности, количество секунд, прошедших с момента Unix Epoch.
Когда они выкупают код, сохраните текущую временную метку Unix. Когда вы проверяете, вычитайте сохраненную временную метку Unix из текущей отметки времени Unix. Если срок действия 24 * # дня действителен, деактивируйте код.
Сохранить
<?php $date = time(); ?>
Проверь это
<?php $validNumDays = 30; $validNumSeconds = $validNumDays * 60 * 60 * 24; $dbtime = GetStoredTimestamp(); $diff = time() - $dbtime; if($diff > $validNumSeconds) { Deactivate(); } ?>