0

24 時間の合計ヒット数を収集するヒット カウンターを作成しようとしています。この 24 時間は、エンド ユーザーのタイム ゾーンに関係なく固定値である必要があります。データベースは 24 時間以内に +1 ヒット カウントで更新され、24 時間のタイム スケールに達したらタイマーをリセットする必要があります。

ここに私がしようとしているものがあります:

$timer = TIME_NOW - 60*60*24;
if ($timer < TIME_NOW)

    $db->query("UPDATE settings SET value=value+1 WHERE name='hits_today'");
}
else
{
    $db->query("UPDATE settings SET value=0 WHERE name='hits_today'");
}

TIME_NOW次のように定義された定数を次に示します。time()

このサイトをたくさん検索しましたが、この質問に対する答えが見つかりませんでした。助けてください。どうすればよいですか?

ありがとう!

4

2 に答える 2

0

ヒットカウントを設定テーブルに保存する代わりに、ヒットカウント専用のテーブルを用意したい場合は、非常に簡単な解決策があります...

+----------+---------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| date     | date    | NO   | PRI | NULL    |       |
| hitcount | int(11) | YES  |     | NULL    |       |
+----------+---------+------+-----+---------+-------+

ヒットカウントを更新するには、次のようにします

INSERT INTO `hitcount` VALUES (CURDATE(), 1) ON DUPLICATE KEY UPDATE hitcount = hitcount + 1;

この方法では、カウンターをリセットする必要がないだけでなく、毎日の統計情報も取得できます!!!

注: エンド ユーザーのタイム ゾーンに関しては、サーバー側からこの情報を確実に取得することはできません (IP を使用して誰かの場所を特定しようとすることはできますが、信頼性は低くなります)。そのため、何らかの方法でユーザーからそれを取得する必要があります (たとえば、ユーザーのブラウザーから JavaScript を使用するか、ユーザーにこれを入力してもらい、どこかに保存します)。

ユーザーのタイムゾーンを日付に使用したい場合は、さらに複雑になる可能性があるため、あまりお勧めしません。サーバーの日付を使用するだけです。

更新: 実際に何を達成しようとしているのか (あなたの質問ではわかりませんが、実装について質問しただけです) に応じて、それに対処する方法は多数あります。私の答えは、カウンターを毎日リセットしたいというヒントとして24時間を使用した質問の解釈です。

于 2014-08-22T18:18:16.097 に答える
0

まず、タイマーの開始時刻をどこかに保存する必要があります。次に、PHP でこのチェックを機能させることができます。それがなければ、最後のチェックから実際にどれだけの時間が経過したかを知ることはできません.

代替ソリューション 1: DB にタイマー値を持つフィールドを作成します。次に、時間をチェックする設定テーブルにON UPDATEトリガーを作成します。つまり、新しい日であれば、この時間を更新してからカウンターをリセットします。

DELIMITER $$
CREATE TRIGGER update_counter
AFTER UPDATE ON settings
FOR EACH ROW
BEGIN
   SET TIMER = (SELECT value FROM settings WHERE name='hits_timer' LIMIT 1);
   IF (TIMER < NOW() - INTERVAL 1 DAY) THEN
       UPDATE settings SET value=NOW() WHERE name='hits_timer';
       UPDATE settings SET value=0 WHERE name='hits_today';
   END IF;
END;
$$
DELIMITER ;

代替ソリューション 2: 最初のソリューションに似ていますが、特定の時間 (真夜中、午前 1 時など) にトリガーされる CRON ジョブを使用します。

于 2014-08-22T18:08:00.040 に答える