Время проверки было в течение последних 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());
Другие вопросы по тегам