2012-01-25 6 views
3

私はPHP/MYSQLを使用しています。ユーザーがログインするたびに、ログインした時間とログインした日付を挿入します。特定の日にログインしたユーザーの数を確認するのは簡単ですが、サイトに費やした時間の計算方法はわかりません。サイトのユーザーの使用状況をトラッキングするには?

たとえば、ユーザーがサインインしたときと同じように、login_trackingテーブルにレコードを挿入すると、ユーザーがログアウトしたときにユーザーが「ログアウト」を押すとそのレコードも更新されます。そうすることで、ログインしてログアウトした時間を差し引いて、各自の時間を費やすことができます。しかし、大多数の人が「ログアウト」しないでクッキー/キャッシュをクリアしたり、に?

これを行うより良い方法はありますか?私はGoogleアナリティクスを使用しています。これは毎日のようにユーザーと訪問を提供していますが、私は独自の方法で使用状況を把握していますか?

私は何ができますか?

更新:@Paulがセッションを使用していたかどうかを尋ねました。私は、これは私がそれを使用している方法です:

$ username = $ _SESSION ["username"];

+0

あなたは '$ _SESSIONS'を使っていますか? –

+0

@Paul yes:$ username = $ _SESSION [" username "]; – AAA

+1

AFAIK、ユーザーセッションが特定の期間アクティブでない状態で破棄されない限り、これを処理する良い方法はありません。このリンクはもう少しあなたを助けるかもしれません。 http://stackoverflow.com/questions/805895/how-come-closing-a-tab-doesnt-close-a-session-cookie –

答えて

1

私は、このような何かをしている簡単なウェブサイトのチャットスクリプトを作った。

私がしたことは、セッションIDとタイムスタンプをテーブルに格納することでした。訪問したすべてのページで、タイムスタンプを更新します。彼らがログアウトすると、私はそのログを破壊する。私はまた、5分間 "非アクティブ"だった他のユーザーのための更新スクリプトのチェックを行い、それらを削除しました。 5分または10分ごとに実行するようにcronジョブを設定し、5〜10分より古いタイムスタンプをチェックし、そのユーザーを非アクティブとしてマークし、サイトで費やされた合計時間を計算することで同じことを達成できます。

特定の時間にユーザーの数を有効にする場合は、http://whos.amung.us/を調べます。いつでもオンラインで人の数を数え、どこから来たのかを数えたシンプルなプラグインです。

1

ログイン日時を保持するフィールドの代わりに「最後に使用した」フィールドを使用し、ログイン日時を保持するフィールドの代わりに「最初に使用した」フィールドを使用することをお勧めします。

ユーザがページをリクエストするたびに、「最後に使用した」値をチェックします(それは、たとえば15分未満など)、現在の日付/時刻に更新します。データベースに新しいレコードを作成する必要があります(ユーザーは今すぐ新しい「セッション」にいるとしますが、新しいセッションを作成する必要はありません)。もちろん、新しく作成されたレコードにセッションを関連付けることもできます。

これは擬似コードです:

Page Requested 
if new session 
    create session 
    create database record (first used=now, last used = now) 
    associate the session with the record 
else 
    query the record associated with the current session 
    if long ago 
     create a new record (first used=now, last used = now) 
     associate the new record with the current session 
    else 
     update the existing record (last used = now) 

それは簡単に見えますが、私もそれを実装しようとしませんでした。

+0

OMFG!私はそれについて考えなかったとは信じられない。しかし、1つの欠点は、ユーザーが1ページにとどまり、ログアウトせずにタブまたはウィンドウを閉じた場合に起こることです。 – AAA

+0

ここに欠点はありません。新しい「セッション」のレコードを作成し、「最初に使用した」(この名前を「ログイン」ではなく)とし、「最後に使用した」を現在の日付に設定し、あなたがそれについて考えるなら、実際には本当です:) –

2

ログオン時の日付時刻を設定すると、これを行うことができます。

だから上のユーザログは今DATETIME、何かのようであるmysqlのフィールド...

$q = $dbc -> prepare("UPDATE accounts SET loggedOn = NOW() WHERE username = ?"); 
$q -> execute(array($_SESSION['username'])); 

を更新あなたがしなければならないだろうすべてはと呼ばれるデータベーステーブル1にさらにいくつかの列を作成する場合totalTime、そして1つはactiveと呼ばれています。すべてのページに

NOW()でもDATETIME列で更新activeをロードし、

$q = $dbc -> prepare("UPDATE accounts SET active = NOW() WHERE username = ?"); 
$q -> execute(array($_SESSION['username'])); 

これにより、ユーザはまだオンラインであるかどうか、あなたが知っていることを保証し、彼らが最後にアクティブだったとき、あなたは確認することができます。非アクティブの5分後、あなたは単にやる合計時間を見つけたい場合は5分間の非アクティブなユーザーは、それが現在の時刻からそれをloggedOn時間がかかるマイナスになる場合は、今以上ないとは何か、

$q = $dbc -> prepare("UPDATE accounts SET totalTime = ADDDATE(totalTime, DATEDIFF(NOW(), loggedOn)) WHERE active < DATE_SUB(NOW(), INTERVAL 5 MINUTE)"); 
$q -> execute(); 

を言いますサイトの合計時間を残してDATETIMEtotalTimeに追加してください。

最後のクエリーを5分ごとに設定するだけで、サイトの人の時間を正確に測定できます。

1

含めるようにlogin_trackingテーブルを調整します。

  • のsession_id(VARCHAR 100)
  • 時間(限り活動があるとして10分毎に更新)
  • 開始(日時を、USER_ID
  • end(クローズドブラウザまたは ログアウトでセッションが終了したときの日時)

コード:これにより

$date = date('Y-m-d H:i:s'); 
$time=time(); 
$time_check=$time-600; // user will be marked online if they have any activity for 10 minutes 
$session=session_id(); 

// check if the user is currently listed as online in the database 
$getactiveession = mysql_query("SELECT * FROM login_tracking WHERE session = '$session' AND end IS NULL"); 
$active_session = mysql_num_rows($getactivesession); 

// if they are not listed as online, insert a row for them 
if($active_session == "0"){ 
$make_active = mysql_query("INSERT INTO login_tracking (session, user_id, time, start) VALUES('$session', '$user', '$time', '$date')"); 
} 
else { 
// UPDATE user's current time if they are already currently logged in 
$update_session = mysql_query("UPDATE login_tracking SET time = '$time', user_id = '$user' WHERE session = '$session'"); 
} 

// get total users online 
$gettotalonline = mysql_query("SELECT * FROM login_tracking"); 
$total_online = mysql_num_rows($gettotalonline); 


// if over 10 minutes and no new activity (time column has not been updated), update end session time 
$end_session_time = mysql_query("UPDATE login_tracking SET end = '$date' WHERE time<$time_check"); 

あなたが挿入するときに私は考えることができる

唯一のものがあるなど、そのプロフィールへのリンクと同様にアバターをすべてのオンラインユーザのリストを表示することができます新しいログインしているユーザーの新しい行には、 "WHERE end IS NULL"の代わりに "WHERE end = '0000-00-00 00:00:00"を実行する必要があります。日付時刻。私は関係なく、私のユーザーは、彼らがログインとみなされます閲覧されるページそのためのすべてのページに配置されて自分のサイト上の機能と同様のものを持って、あなたのコメント#1

応答。だから、どこにでも実装するのは簡単です。

しかし、おそらく10分以上の記録をチェックするために毎分または10分実行するためのクレンジングとしてその一部を設定する必要があります。ユーザーがブラウザを閉じてもログアウトしないと、別のユーザー(ログインまたはゲスト)が上記のコードが実行されているページにアクセスするまで、データベース内のレコードは更新されません。あなたがそれを実行しているcronjobを持っている場合は、問題はありません。 (これはまた、実行されているセッション終了時間についてのあなたのコメントにも対応しています。私のサイトは、あなたがポイントを上げたことをとても嬉しく思うので、あなたのためのcronjobは私が考える必要があります)。 ログアウトページにリダイレクトする場合は、ページがリフレッシュされていないときにどのように動作するのかわかりません。それはおそらくアヤックスや何かになる必要があります。

+0

スクリプトのおかげで! 10分を過ぎるとテーブルが更新されますが、$ end_session_timeはどのように実行されますか?そして私はすべてのページでこれが必要ですか?また、10分後にユーザーがログアウトしたければ、どのようにヘッダ( "Location:logout.php")を含めることができますか? $ end_session_timeまで – AAA

関連する問題