Время проверки было в течение последних 24 часов в PHP - PullRequest
1 голос
/ 13 июля 2011

Я разработал систему рефералов, в которой зарегистрированные пользователи могут отправлять рефералов туда, где есть семья / друзья, чтобы рекомендовать им зарегистрироваться.

Все работает отлично, но вчера решил, что я бы ограничил максимальное количество рефералов, которые кто-либо мог отправить в течение 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, и когда я сделаю все, все, что я получаю, - это имя поля, create_on , а не фактическое значение, которое в этом случае должно отображать метку времени. Поле create_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 ]

9 голосов
/ 13 июля 2011

НИКОГДА не фильтруйте полный набор результатов 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, вы должны изучить это прямо сейчас.

2 голосов
/ 13 июля 2011

Вы также можете использовать 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?

1 голос
/ 13 июля 2011

created_on int (11) NOT NULL, updated_on int (11) DEFAULT NULL,

Конечно, это должны быть поля даты и времени?

1 голос
/ 13 июля 2011

Ваш запрос должен быть

$referral_limit = mysql_query("SELECT `created_on` FROM `referrals`
 WHERE `referrer_uid` = $referrer_uid ") or die(mysql_error());

Это обратные пометки для созданного_онуса, а не кавычек.Если вы используете кавычки, поле становится строкой, похожей на SELECT 1 FROM table, которая возвращает 1

1 голос
/ 13 июля 2011

Не ставьте одинарные кавычки вокруг имени поля, которое вы выбираете, так как это будет интерпретироваться как возвращаемая строка.Например, вам нужно

SELECT created_on ...

(если только у вас на самом деле нет обратных кодов в вашем коде, а код, включенный в ваш пример, неверен).

0 голосов
/ 13 июля 2011

изменить ваш запрос

$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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...