Restringir la entrada de la competencia a una vez al día
Pregunta
Estoy escribiendo un guión de competencia de PHP para un sitio de miembros que necesita restringir las entradas a uno por día por miembro. Hasta ahora tengo el siguiente código 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 es la ID de competencia,
- ce_sub_id es la identificación del miembro y
- CTE_DATE es un sello de DateTime de MySQL para la entrada.
Es difícil para mí probar desde donde estoy ahora y necesito encontrar una solución, así que espero que alguien pueda decirme si esto está restringiendo a una vez por día o una vez por 24 horas, y señalarme el Dirección correcta si es lo último.
Tia :)
Solución
Cree una clave primaria compuesta por User_ID, Competition_ID y una columna de tipo de fecha.
Para verificar si el usuario ya ha colocado una entrada:
select count(*)
from competition_entries
where ce_c_id = '$c_id'
AND ce_sub_id = '$user_id'
AND cte_date = current_date()
Otros consejos
Espero que alguien pueda decirme si esto se está restringiendo a una vez por día o una vez por 24 horas.
Parece que son 24 horas:
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)
Si necesita "mañana", como en, esta noche a un minuto después de las 23:59, considere morder las cosas a la vieja DATE
Resolución:
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)
Simplemente considerando las fechas en lugar de los tiempos, su límite expirará efectivamente a la medianoche. Sin embargo, ten cuidado: luego estará a merced de la hora en su servidor MySQL, que podría diferir de la hora en su servidor de aplicaciones si están en diferentes máquinas.
No puedo estar seguro sin pruebas, pero supongo que es una vez cada 24h.
Pruebe lo siguiente en su lugar:
SELECT ce_id FROM competition_entries WHERE ce_c_id = '$c_id' AND ce_sub_id = '$user_id' AND DATE(cte_date) == DATE(SYSDATE())
Aquí está comparando claramente dos fechas, una de su campo y la otra desde la fecha actual de igualdad.