2013-05-23 3 views
2

Мне нужна ежедневная бонусная система. Пользователь должен иметь возможность получать бонус один раз в день. я закодирован что-то вроде этого:PHP Дневной бонус

function checkDailyBonus($user, $type) { 
    global $ado; 
    $last_day = strtotime(date("Y:m:d 00:00:00")); 

    $query = $ado->exec("SELECT * FROM claimed_bonuses WHERE `user` = '$user' and `type` = '$type' ORDER BY `id` DESC"); 
    $row = mysql_fetch_assoc($query); 
    $date = strtotime($row['date']); 
    if ($ado->count($query) < 1) { 
     return 1; 
    } else { 
     if ($last_day < $date) { 
      return 0; 
     } else { 
      return 1; 
     } 
    } 
} 

Но его возвращение неверного результата: даже если сегодня выше, последний претензии бонус скрипт возвращает 0, но оно должно быть возвращение 1 вместо этого. Последняя дата претензии - 2013-05-19 23:05:41. Заранее благодарю за любую помощь.

+3

Похоже, вы умоляете SQL-инъекцию. – John

+0

Как вы обращаетесь к базе данных? Является ли ваша функция 'exec' возвращать что-то, что вы можете передать в' mysql_fetch_assoc() '? – andrewsi

+2

@John, это было бы верно, если бы '$ type' и' $ user' были введены пользователем, но здесь нет никаких указаний. –

ответ

2

umm, почему бы и нет.

SELECT .. 
FROM claimed_bonuses 
WHERE DATE(lastbonus) < CURDATE() 

Это выходит бессмысленно все эти StrToTime звонки и фильтровать всю пользовательскую таблицу в PHP, когда вы можете иметь MySQL сделать это гораздо проще непосредственно в запросе ...

+0

Я не знаю, как чечк, если пользователь сегодня подал бонус. Если да, сценарий должен возвращать 0, если нет 1, и если на следующий день он также должен вернуть 1 –

0

Не зная структуру базы данных Я не могу написать это для вас, но я бы рекомендовал делать это в запросе, как:

за текущий день:

SELECT * FROM claimed_bonuses 
WHERE `user` = '$user' and `type` = '$type' 
AND date_format(`date`, '%Y%b%e') = date_format(now(), '%Y%b%e') 

Тогда просто проверить, если он возвратил строку или нет.

+0

, то почему все форматирование строк, если вы можете сравнить даты напрямую? date (dateifled) = date (otherdatefield)? –

+0

Я пришел, чтобы проверить, был ли заявленный бонус в текущий день, и вернуть 1, если нет, и 0, если да –

+0

в этом случае, потому что я взял это из фрагмента кода, который у меня был, когда мне нужно было это сделать по другим причинам, это было частью чего-то больше, и я удалил все остальное, что было связано со мной, зацикливаясь на вещах. я полагаю, это не имеет большого значения в любом случае. Я согласен с тем, что в этом случае нет причин делать это за пределами SQL. –

Смежные вопросы