Intereting Posts

Ограничить запись конкурса один раз в день

Я пишу сценарий конкуренции PHP для сайта участников, который должен ограничивать записи по одному в день на каждого члена. До сих пор у меня есть следующий код MySQL:

SELECT ce_id FROM competition_entries WHERE ce_c_id = '$c_id' AND ce_sub_id = '$user_id' AND cte_date >= SYSDATE() - INTERVAL 1 DAY 
  • ce_c_id – это идентификатор соревнования,
  • ce_sub_id – это идентификатор участника и
  • cte_date – это штамп даты и времени MYSQL для записи.

Мне сложно проверить, откуда я сейчас, и мне нужно найти решение, поэтому я надеюсь, что кто-то скажет мне, ограничивает ли это один раз в день или один раз в сутки, – и укажите мне если это последнее.

TIA 🙂

Создайте первичный ключ, состоящий из столбцов user_id, contest_id и столбца типа даты.

Чтобы проверить, разместил ли пользователь запись:

 select count(*) from competition_entries where ce_c_id = '$c_id' AND ce_sub_id = '$user_id' AND cte_date = current_date() 

Я надеюсь, кто-то скажет мне, ограничивает ли это один раз в день или один раз в сутки

Похоже, что 24 часа:

 mysql> select sysdate(), sysdate() + interval 1 day; +---------------------+----------------------------+ | sysdate() | sysdate() + interval 1 day | +---------------------+----------------------------+ | 2011-03-21 15:50:56 | 2011-03-22 15:50:56 | +---------------------+----------------------------+ 1 row in set (0.01 sec) 

Если вам нужно «завтра», как сегодня вечером, в одну минуту 23:59, подумайте о том, чтобы переложить все на простое разрешение старого DATE :

 mysql> select DATE(sysdate()), DATE(sysdate()) + interval 1 day; +-----------------+----------------------------------+ | DATE(sysdate()) | DATE(sysdate()) + interval 1 day | +-----------------+----------------------------------+ | 2011-03-21 | 2011-03-22 | +-----------------+----------------------------------+ 1 row in set (0.00 sec) 

Просто рассматривая даты вместо времени, ваше обрезание эффективно истечет в полночь. Однако будьте осторожны – тогда вы будете во власти вашего сервера MySQL, который может отличаться от времени на вашем сервере приложений, если они находятся на разных машинах.

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

Вместо этого попробуйте следующее:

 SELECT ce_id FROM competition_entries WHERE ce_c_id = '$c_id' AND ce_sub_id = '$user_id' AND DATE(cte_date) == DATE(SYSDATE()) 

Здесь вы четко сравниваете две даты, одну из своей области, а другую – с текущей даты равенства.