Я пишу сценарий конкуренции 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
Мне сложно проверить, откуда я сейчас, и мне нужно найти решение, поэтому я надеюсь, что кто-то скажет мне, ограничивает ли это один раз в день или один раз в сутки, – и укажите мне если это последнее.
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())
Здесь вы четко сравниваете две даты, одну из своей области, а другую – с текущей даты равенства.