2

メンバーサイトのPHPコンテストスクリプトを作成しています。このスクリプトでは、エントリをメンバーごとに1日1回に制限する必要があります。これまでのところ、次の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は競争IDであり、
  • ce_sub_idはメンバーIDであり、
  • cte_dateは、エントリのMYSQL日時スタンプです。

私が今いる場所からテストするのは難しいですし、解決策を見つける必要があるので、誰かがこれが1日1回または24時間に1回に制限されているかどうかを教えてくれることを願っています-そして私を指摘してください後者の場合は正しい方向。

TIA :)

4

3 に答える 3

2

user_id、competition_id、および日付タイプの列で構成される主キーを作成します。

ユーザーがすでにエントリを配置しているかどうかを確認するには、次の手順に従います。

select count(*)
from competition_entries
where ce_c_id = '$c_id' 
    AND ce_sub_id = '$user_id' 
    AND cte_date = current_date()
于 2011-03-21T22:52:04.040 に答える
1

これが1日1回に制限されているのか、24時間に1回に制限されているのかを誰かが教えてくれることを願っています

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)

DATE23:59を過ぎた今夜のように「明日」が必要な場合は、昔ながらの解決策に切り詰めることを検討してください。

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サーバーの時間に翻弄されることになります。これは、アプリケーションサーバーが別のマシンにある場合は、アプリケーションサーバーの時間とは異なる場合があります。

于 2011-03-21T22:51:59.983 に答える
1

テストなしでは確信が持てませんが、24時間に1回だと推測するのは危険です。

代わりに次を試してください。

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

ここでは、2つの日付を明確に比較しています。1つはフィールドからのもので、もう1つは現在の日付からのものです。

于 2011-03-21T22:56:32.920 に答える