Limitare l'ingresso della concorrenza a una volta al giorno
Domanda
Sto scrivendo uno script di competizione PHP per un sito dei membri che deve limitare le voci a una al giorno per membro. Finora ho il seguente codice 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 è l'ID competizione,
- ce_sub_id è l'ID membro e
- CTE_Date è un timbro DateTime MySQL per la voce.
È difficile per me testare da dove mi trovo ora e ho bisogno di trovare una soluzione, quindi spero che qualcuno possa dirmi se questo è limitato a una volta al giorno o una volta al 24 ore e indicami Direzione giusta se è quest'ultimo.
Tia :)
Soluzione
Crea una chiave primaria composta dalla colonna USER_ID, CONTACT_ID e una data.
Per verificare se l'utente ha già inserito una voce:
select count(*)
from competition_entries
where ce_c_id = '$c_id'
AND ce_sub_id = '$user_id'
AND cte_date = current_date()
Altri suggerimenti
Spero che qualcuno possa dirmi se questo è limitato a una volta al giorno o una volta al 24 ore
Sembra che siano 24 ore:
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)
Se hai bisogno di "domani", come in, stasera a un minuto dopo le 23:59, considera di abbattere le cose per un vero vecchio DATE
Risoluzione:
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)
Considerando le date anziché i momenti, il cutoff scadrà effettivamente a mezzanotte. Attenzione, però - sarai quindi in balia del tempo sul tuo server MySQL, che potrebbe differire dal tempo sul server delle applicazioni se si trovano su macchine diverse.
Non posso esserne sicuro senza testare, ma rischiare di indovinare che una volta ogni 24 ore.
Prova invece quanto segue:
SELECT ce_id FROM competition_entries WHERE ce_c_id = '$c_id' AND ce_sub_id = '$user_id' AND DATE(cte_date) == DATE(SYSDATE())
Qui stai chiaramente confrontando due date, una dal tuo campo e l'altra dalla data corrente per l'uguaglianza.