PHP*_*VER 1 php mysql time datetime referrals
我已经开发了一个推荐系统,登录的会员可以将推荐信息发送给那里的家人/朋友,以推荐他们注册.
一切正常,但昨天我决定限制一个人可以在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.";
}
}
}
Run Code Online (Sandbox Code Playgroud)
我曾尝试和回声出$ 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 ;
Run Code Online (Sandbox Code Playgroud)
经过一些帮助,这是我的代码.它仍然说在过去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.";
}
Run Code Online (Sandbox Code Playgroud)
当你也可以在MySQL中过滤它时,不要过滤PHP中的完整MySQL结果集.在您的代码示例中,您只能从MySQL获取数千行,以便通过过滤循环运行它们.这是迄今为止最难的性能杀手.而是使用更好的SQL语句:
SELECT COUNT(*) FROM 'referrals' WHERE `referrer_uid`=? AND created_on > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))
Run Code Online (Sandbox Code Playgroud)
此语句仅返回过去24小时内给定引用者的referals计数(!).
此外,你永远不应该把变量直接插入MySQL WHERE name=$name,这会打开你的应用程序到无数的SQL注入攻击.如果您不知道sql注入是什么,您应该立即学习它.