PHP过期日期

时间:2014-08-12 13:17:36

标签: php mysql

背景信息

我正在为游戏玩家创建一个捐赠/购买系统。当用户通过paypal捐赠我有php代码处理ipn并将数据输入数据库时​​它还会生成一个串行密钥并通过电子邮件发送给用户,然后用户可以在游戏中输入此内容,当用户在游戏中进入串行检查时数据库看到密钥是否有效,然后执行相关的lua代码。到目前为止,该系统运作良好,但捐赠包持续一段时间30天,90天,180天和365天。

我想要实现的是当用户在游戏中输入密钥时,我将拥有存储玩家蒸汽ID的lua代码以及他们兑换它的日期以及包裹将持续多长时间。我将设置一个cron作业来运行一个脚本,检查数据库是否使用了密钥,如果密钥已被使用,它将检查,例如,自从他们兑换密钥以来是否已过去30天,如果它在30天内如果超过30天则不会做任何事情,那么它会将表格中的值从0更改为1。

问题

我真正努力想要解决的部分是如何存储日期和检查日期,最初我认为我会使用一年中的某一天但是随后会出现从365年到0如果有人在12月份购买它90天,那么就会发生错误。那么如何才能可靠地解决这一年的变化呢?

感谢所有发布答案并且速度非常快的人,我认为我现在已经有足够的工作了,再次感谢您的时间

3 个答案:

答案 0 :(得分:2)

首先计算包裹过期的日期。 (如果需要,可以使用PHP的DateTime class完成)然后您只需将其与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
}

答案 1 :(得分:2)

好吧,我不知道你的数据库结构,但是我们说它是这样的:

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小提琴: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小提琴:http://sqlfiddle.com/#!2/f95ea/9

答案 2 :(得分:1)

使用Unix Timestamp。它将当前日期存储为数字。具体来说,自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(); }
?>