Question

J'écris un script PHP de la concurrence pour un site de membres qui doit limiter les entrées à un par jour et par membre. Jusqu'à présent, j'ai le code de MySQL suivant:

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 est l'ID de la concurrence,
  • ce_sub_id est l'ID de membre, et
  • cte_date est un timbre datetime MYSQL pour l'entrée.

Il est difficile pour moi de test à partir de là où je suis maintenant et je dois trouver une solution, donc je suis en espérant que quelqu'un peut me dire si cela est limiter à une fois par jour ou une fois par-24hrs - et le point moi dans la bonne direction si elle est celle-ci.

TIA:)

Était-ce utile?

La solution

Créer une clé primaire composée du user_id, competition_id et une colonne de type date.

Pour vérifier si l'utilisateur a déjà placé une entrée:

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

Autres conseils

J'espère que quelqu'un peut me dire si cela est limiter à une fois par jour ou une fois par-24hrs

On dirait qu'il est 24 heures:

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 vous avez besoin « demain », comme, ce soir à une minute après 23h59, considérer les choses chomping vers le bas à la résolution ancienne plaine 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)

En ne considérant que les dates au lieu de fois, votre coupure expirera efficacement à minuit. Attention, si -. Vous serez alors à la merci du temps sur votre serveur MySQL, ce qui pourrait différer du temps sur votre serveur d'applications si elles sont sur des machines différentes

ne peut pas être sûr sans essai, mais je voudrais hasarder une hypothèse qu'il est une fois toutes les 24 heures.

Essayez ce qui suit à la place:

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

Ici, vous comparez clairement deux dates, l'un de votre champ et l'autre de la date actuelle pour l'égalité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top