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

标签 php mysql datetime time referrals

我开发了一个推荐系统,登录成员(member)可以向那里的家人/ friend 推荐他们注册。

一切正常,但昨天我决定限制某人在 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.";
            }
    }
}

我确实尝试回显 $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 中获取数千行,只是为了通过过滤循环运行它们。这是有史以来最难的性能 killer 。而是使用更好的 SQL 语句:

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

此语句仅返回过去 24 小时内给定引荐来源的引荐计数 (!)。

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

关于php - 在 PHP 中检查时间在过去 24 小时内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6677177/

相关文章:

php - codeigniter中的SQL查询错误

php mysql 选择年月

php - 使 mp3 可搜索 PHP

java - 如何从 Java 中的非连续日期数组中列出缺失的日期?

python - 将任何纪元转换为系统时区的人类可读格式

python - 根据无序日期在 pandas 中创建日期时间对象

php - PHP在另一页中重用SSH连接

mysql - UPDATE 语句更新一行中的多个字段

mysql - 当我需要一个空集时 SQL 查询显示空值

mysql - 如何使用 MYSQL 查询结果创建公式