Время проверки было в течение последних 24 часов в PHP
Я разработал систему рефералов, в которой зарегистрированные пользователи могут отправлять рефералов своей семье / друзьям, чтобы они рекомендовали им зарегистрироваться.
Все работает отлично, но вчера решил, что я бы ограничил максимальное количество рефералов, которые кто-либо мог отправить в течение 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, и когда я сделаю все, что я получаю, будет возвращено имя поля, которое создается, а не фактическое значение, которое в этом случае должно отображать метку времени. Поле made_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.";
}
6 ответов
НИКОГДА не фильтруйте полный набор результатов MySQL в PHP, если вы также можете фильтровать его в MySQL. В вашем примере кода вы выбираете, может быть, тысячи строк из MySQL только для запуска их через цикл фильтрации. Это самый тяжелый убийца производительности когда-либо. Скорее используйте лучший оператор SQL:
SELECT COUNT(*) FROM 'referrals' WHERE `referrer_uid`=? AND created_on > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))
Этот оператор просто возвращает количество (!) Рефералов данного реферера за последние 24 часа.
Кроме того, вы никогда не должны вставлять переменные непосредственно в MySQL, как WHERE name=$name
это открывает ваше приложение для множества атак 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_on
это datetime
или timestamp
, Почему это объявлено INT
?
Ваш запрос должен быть
$referral_limit = mysql_query("SELECT `created_on` FROM `referrals`
WHERE `referrer_uid` = $referrer_uid ") or die(mysql_error());
Это обратные пометки для созданного_оценки, а не кавычек. Если вы используете кавычки, поле становится строкой, аналогичной SELECT 1 FROM table
который возвращает 1
created_on
int (11) NOT NULL, updated_on
int (11) DEFAULT NULL,
Конечно, это должны быть поля даты и времени?
Не ставьте одинарные кавычки вокруг выбранного имени поля, так как это будет интерпретироваться как возвращаемая строка. Например вам нужно
SELECT created_on ...
(если у вас на самом деле нет обратных галочек в вашем коде, а код, включенный в ваш пример, неверен)
Изменить ваш запрос
$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());