我开发了一个推荐系统,登录的会员可以向家人/朋友发送推荐信,建议他们注册。
一切正常但昨天我决定限制某人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.";
}
答案 0 :(得分:9)
当您还可以在MySQL中过滤它时,不要过滤PHP中的完整MySQL结果集。在您的代码示例中,您只能从MySQL获取数千行,以便通过过滤循环运行它们。这是迄今为止最难的性能杀手。而是使用更好的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注入攻击。如果您不知道sql注入是什么,您应该立即学习它。
答案 1 :(得分:2)
您也可以使用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_on
是datetime
或timestamp
。为什么声明INT
?
答案 2 :(得分:1)
不要在您选择的字段名周围放置单引号,因为这将被解释为要返回的字符串。例如。你需要
SELECT created_on ...
(除非您的代码实际上有反引号,并且示例中包含的代码不正确)。
答案 3 :(得分:1)
您的查询应该是
$referral_limit = mysql_query("SELECT `created_on` FROM `referrals`
WHERE `referrer_uid` = $referrer_uid ") or die(mysql_error());
这是created_on的反引号,而不是引号。如果使用引号,该字段将变为字符串,类似于SELECT 1 FROM table
,返回1
答案 4 :(得分:1)
created_on
int(11)NOT NULL,
updated_on
int(11)DEFAULT NULL,
当然这些应该是日期时间字段吗?
答案 5 :(得分:0)
更改您的查询
$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());