首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中,检查时间在过去的24小时内

在PHP中,检查时间在过去的24小时内
EN

Stack Overflow用户
提问于 2011-07-13 10:02:19
回答 6查看 4.7K关注 0票数 1

我已经开发了一个转介系统,登录成员可以发送推荐信到那里的家人/朋友,以建议他们注册。

一切正常,但昨天决定,我将限制最大限度的推荐,有人可以在24小时内发送。我已将此限制为每天最多3次转介。

我发布了一些代码,我似乎在下面遇到了问题。我遇到的问题是,无论看起来是什么,我都会收到错误信息,说我已经达到了今天的最大推荐量。我不知道我的代码做错了什么。

代码语言:javascript
复制
// 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.";
            }
    }
}

我确实尝试了回显$db_time,当我这样做时,返回的只是字段名,即、created_on、,而不是实际值,在本例中,这个值应该显示时间戳。数据库中的created_on字段包含引用的时间戳,我检查它以确保引用用户在过去24小时内没有进行引用。

您还会注意到,我没有添加限制它为每天3的额外位,但我不想添加该位,直到我可以首先解决这个问题。

数据库表如下所示:

代码语言:javascript
复制
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小时内进行了一次转诊,尽管没有。

我想我做错了错误检查。

代码语言:javascript
复制
$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.";
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-07-13 10:09:03

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

代码语言:javascript
复制
SELECT COUNT(*) FROM 'referrals' WHERE `referrer_uid`=? AND created_on > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))

此语句只返回count (!)在过去的24小时内被推荐到指定的推荐人。

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

票数 9
EN

Stack Overflow用户

发布于 2011-07-13 10:09:13

您还可以使用MySQL来计算:

代码语言:javascript
复制
$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

票数 2
EN

Stack Overflow用户

发布于 2011-07-13 10:07:02

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

代码语言:javascript
复制
SELECT created_on ...

(除非您的代码中有回退,并且示例中包含的代码是不正确的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6677177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档