1

サイトでの滞在時間を追跡するための 3 つの変数があります

 $_SESSION['checkin']; //logged when user first enters the site 
 $_SESSION['loggedAt']; //logged when the user leaves the site
 $_SESSION['timespent']; //time spent in minutes

私がやろうとしているのは、ユーザーがページを離れるたびに、これらの値がデータベースにプッシュされることです。私が行ったことは、onbeforeunload を使用することです。

以下は私がそれを使用している方法です:

すべてのページで:

 <script type="text/javascript" src="js/storeSession.js"></script>

storeSession.js:

window.onbeforeunload = confirmExit();
  function confirmExit()
  {
        var xhr = new XMLHttpRequest();
        xhr.open('post','../php/storeSession.php',true);
        xhr.send();
        return "Are you sure you want to leave?";
  }

そして storeSession.php:

$_SESSION['loggedAt'] = time();
$temptime = (double)$_SESSION['timespent']/60;
$_SESSION['timespent'] = $_SESSION['loggedAt'] - $_SESSION['checkin'];

mysql_select_db($db, $conn) or die(mysql_error()); 

$data = mysql_query("INSERT INTO user (user_id, timespent) VALUES ($tempuser, $temptime) ON DUPLICATE KEY UPDATE timespent = timespent + $temptime")
        or die(mysql_error()); 

$_SESSION['timespent'] = null;
$_SESSION['loggedAt'] = null;
$_SESSION['checkin'] = null;

mysql_close($con);

問題を見つけることができず、すべてが正常に機能しているようです (エラーなどはありません)。誰にもアイデアはありますか?

4

3 に答える 3

2

1 つの問題は次の行です。

window.onbeforeunload = confirmExit();

window.onbeforeunload関数自体を割り当てるのではなく、関数を呼び出して戻り値をに割り当てました。

行を次のように変更します。

window.onbeforeunload = confirmExit;

...またはクロージャーを使用します。

また、データを送信せずに POST リクエストを作成しています ( の最初の引数には何も渡していませんsend())。おそらく、代わりに GET リクエストを作成する必要があります。

于 2012-12-18T11:33:46.037 に答える
1

onbefore関数から括弧を削除する必要があります

window.onbeforeunload = confirmExit;

また、確認する前に、XHR呼び出しでセッションを終了します。ユーザーがアンロードをキャンセルした場合でも、ユーザーはログアウトされます。

于 2012-12-18T11:37:25.110 に答える
0

onunloadの代わりに使ってみましたかonbeforeunload?後者は、ユーザーがページ (またはブラウザー) を終了するのを防ぐために使用される可能性があるため、制限されていることを覚えています。完全にはわかりませんが、(ほとんどの) ブラウザーは返された文字列のみを読み取り、残りは無視すると思います。

また、私は on(before)unload アクションでいくつかの問題を抱えており、サーバーとの同期通信を明示的に使用して解決しました (私は jquery + ajax を使用しました)。それ以外の場合、ajax 要求は完了しませんでした (ただし、XMLHttpRequest、しかし、このオプションは同等であるべきだと思います)

于 2012-12-18T11:57:24.527 に答える