Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP过期日期_Php_Mysql - Fatal编程技术网

PHP过期日期

PHP过期日期,php,mysql,Php,Mysql,背景信息 我正在为游戏garrys mod创建一个捐赠/购买系统。当用户通过paypal进行捐赠时,我有处理ipn并将数据输入数据库的php代码,它还会生成一个串行密钥并通过电子邮件发送给用户,用户可以在游戏中输入该密钥。当用户在游戏中输入串行密钥时,它会检查数据库,查看密钥是否有效,然后执行相关的lua代码。到目前为止,该系统运行良好,但捐赠包的持续时间分别为30天、90天、180天和365天 我想要实现的是,当用户在游戏中输入密钥时,我将拥有lua代码,该代码存储玩家steam id以及他们

背景信息

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

我想要实现的是,当用户在游戏中输入密钥时,我将拥有lua代码,该代码存储玩家steam id以及他们兑换id的日期,以及该包将持续多长时间。我将设置一个cron作业来运行一个脚本,该脚本将检查数据库是否使用了密钥,如果使用了密钥,它将检查自他们赎回密钥以来是否已过30天,如果低于30天,则不执行任何操作,如果超过30天,则它将表中的值从0更改为1

问题

我真正想弄清楚的部分是如何存储日期和检查日期,起初我以为我会使用一年中的某一天,但后来出现了一个问题,即年份从365变为0。如果有人在12月购买了90天,那么就会出现错误。那么,考虑到年份的变化,我如何才能可靠地做到这一点呢


感谢所有快速发布答案的人,我想我现在已经有足够的时间来工作了,再次感谢您抽出时间

首先计算包裹过期的日期。(如果需要的话,可以使用PHP的函数实现)然后您可以简单地将其与
time()进行比较

$date=新日期时间('2014-01-01')//购买日期
$date->add(新的日期间隔('P30D'))//在这种情况下,持续30天
if(time()<$date->getTimestamp())
{
//过期
}
使用。它将当前日期存储为一个数字。具体来说,是自Unix时代以来的秒数

当他们兑换代码时,存储当前Unix时间戳。选中时,从当前Unix时间戳中减去存储的Unix时间戳。如果有效期超过24天,请停用该代码

储存

<?php
$date = time();
?>

检查一下

<?php
$validNumDays = 30;
$validNumSeconds = $validNumDays * 60 * 60 * 24;
$dbtime = GetStoredTimestamp();
$diff = time() - $dbtime;

if($diff > $validNumSeconds) { Deactivate(); }
?>

我不知道您的数据库结构,但假设是这样的:

user_table
-----------------------------------------
user_id   | date_of_redeem | subscription
-----------------------------------------
user1     | 2014-02-01     | 90
user2     | 2014-05-18     | 365
user3     | 2014-07-22     | 180
SELECT `user_id` AS `User`, (DATE_ADD(`date_of_redeem`, INTERVAL `subscription` DAY)) AS `Subscription Ends`
FROM `user_table`
因此,如果只使用SQL语句,您可以使用诸如DATE\u SUB之类的语句。将赎回日期与今天的日期减去订阅金额进行比较。如果赎回日期的值较高,则您将得到一个结果,否则它将返回一个空结果集

SELECT *
FROM `user_table`
WHERE `date_of_redeem` > DATE_SUB(NOW(), INTERVAL `subscription` DAY) AND `user_id` = 'desired_user_id'
编辑:用于上述查询的SQL FIDLE:(只需将
user3
更改为任何用户ID,以检查它们是否返回任何结果

如果希望获得包含所有订阅到期日期的表,则可以执行以下操作:

user_table
-----------------------------------------
user_id   | date_of_redeem | subscription
-----------------------------------------
user1     | 2014-02-01     | 90
user2     | 2014-05-18     | 365
user3     | 2014-07-22     | 180
SELECT `user_id` AS `User`, (DATE_ADD(`date_of_redeem`, INTERVAL `subscription` DAY)) AS `Subscription Ends`
FROM `user_table`

SQL Fiddle:

为什么不使用一个?2038年1月19日之前您都会安全:)MySQL:/PHP:我会使用POSIX时间,而不是正常的时间日期这里的问题是计算包过期的日期这就是为什么我在考虑天数,我想让它尽可能简单,感谢我看到的唯一问题是,我用lua写下他们兑换钥匙的日期,并且必须使用这里显示的os.date函数,我看不到epoch函数。当他们激活代码时,在服务器端生成日期。到目前为止,这似乎是一个过于简单的选择。如果我将该语句放入一个php脚本中,并每天使用cron运行php脚本,那么这将正常工作?那么,为什么不在验证期间使用它呢?每当用户想要登录,或者想要做一些与其订阅相关的事情时,只要检查数据库(如果数据库已过期)。不需要cron作业。这是可能的,但它可能会导致服务器上的延迟,因为我更愿意让web服务器来做这项工作,而不是让玩家在游戏中遇到延迟。从这一点上说,这取决于您。我更新了我的答案,提供了两个SQL FIDLE链接,以及一个SQL查询,返回所有用户的订阅到期日期。