检查时间在PHP中是过去24小时内



我开发了一个推荐系统,登录的会员可以向他们的家人/朋友发送推荐,推荐他们注册。

一切都很好,但昨天决定我将限制某人可以在24小时内发送的最大推荐。我把这个限制在每天最多3个转诊。

我张贴的代码,我似乎有下面的问题。我遇到的问题是,无论看起来如何,我都会得到错误消息,说我已经达到了今天的最大推荐。我不确定我在代码中做错了什么。

// referral query
$referral_limit = mysql_query("SELECT 'created_on' FROM 'user_referrals'
WHERE `referrer_uid` = $referrer_uid ") or die(mysql_error());
if(mysql_num_rows($referral_limit) > 0){
    while($row = mysql_fetch_assoc($referral_limit)){
            $db_time = $row['created_on'];
            if((time() - $db_time) > 86400){
                // is within 24 hours and has reached maximum daily referral allowance
                $error[] = "You have reached the maximum referrals for today.";
            }
    }
}

我确实尝试并echo出$db_time,当我做所有我得到返回的是字段名,这是created_on,而不是实际值,在这种情况下应该显示时间戳。数据库中的created_on字段包含进行推荐的时间戳,我检查这一点以确保引用用户在过去24小时内没有进行推荐。

你也会注意到我没有添加额外的位来限制它每天3个,但是我不想添加那个位,直到我能先解决这个问题。

数据库表如下所示:

CREATE TABLE IF NOT EXISTS `user_referrals` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`referrer_uid` int(11) NOT NULL,
`recipient_username` varchar(15) NOT NULL,
`referrer_email` varchar(254) DEFAULT NULL,
`referred_id` char(32) NOT NULL,
`referred_email` varchar(254) NOT NULL,
`status` char(9) NOT NULL,
`created_on` int(11) NOT NULL,
`updated_on` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `referred_id` (`referred_id`),
KEY `referrer_uid` (`referrer_uid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=72 ;

编辑

这是我的代码经过一些帮助。它仍然说在过去24小时内进行了推荐,即使没有。

我想我做错了错误检查。

$referral_limit = mysql_query("
        SELECT COUNT(*)
        FROM `user_referrals`
        WHERE `referrer_uid` = $referrer_uid
        AND `created_on` > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))") or die(mysql_error());
if($referral_limit > 0) {
    $error[] = "You have reached the maximum referrals for today.";
}

当你可以在MySQL中过滤时,千万不要在PHP中过滤完整的MySQL结果集。在您的代码示例中,您可能从MySQL中获取数千行,只是为了通过过滤循环运行它们。这是有史以来最难的表演杀手。不如使用更好的SQL语句:

SELECT COUNT(*) FROM 'referrals' WHERE `referrer_uid`=? AND created_on > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))

这条语句只返回给定referer在过去24小时内的referer次数。

此外,你不应该像WHERE name=$name那样直接在MySQL中插入变量,这会使你的应用程序受到无数SQL注入攻击。如果你不知道什么是sql注入,你应该现在就学习它

你也可以用MySQL来计算:

$referral_limit = mysql_query("SELECT COUNT(*)
                               FROM referrals
                               WHERE referrer_uid = $referrer_uid
                               AND created_on >= NOW() - INTERVAL 1 DAY
                              ") or die(mysql_error());
created_ondatetimetimestamp

。为什么声明为INT ?

不要在您选择的字段名周围加上单引号,因为这将被解释为要返回的字符串。例如:

SELECT created_on ...

(除非您的代码中实际上有反引号,并且示例中包含的代码是错误的)

你的查询应该是

$referral_limit = mysql_query("SELECT `created_on` FROM `referrals`
 WHERE `referrer_uid` = $referrer_uid ") or die(mysql_error());

表示created_on的是反引号而不是引号。如果使用引号,则字段变成字符串,类似于返回1

SELECT 1 FROM table

created_on int(11) NOT NULL,updated_on int(11) DEFAULT NULL,

当然这些应该是日期时间字段?

更改查询

$referral_limit = mysql_query("SELECT 'created_on' FROM 'user_referrals'WHERE `referrer_uid` = $referrer_uid ") or die(mysql_error());

$referral_limit = mysql_query("SELECT `created_on` FROM `user_referrals` WHERE `referrer_uid` = $referrer_uid ") or die(mysql_error());

相关内容

  • 没有找到相关文章

最新更新