0

個々のユーザーが自分のサイトにいる時間の長さを追跡しています。これを実現するために、ユーザーが最初にページを読み込んだときと、新しいページをクリックするたびのタイムスタンプを記録しています。

簡単な要約:

データベーステーブル(time_on_site):

+-------+-----+-----------+----+
| start | end | unique_id | id |
+-------+-----+-----------+----+
  1. startセッションが作成されたときにタイムスタンプを挿入します(1回だけ)。
  2. イベントが発生するendたびにタイムスタンプを更新します。onbeforeunload

これは、ページを閲覧しているときにサイトにいる時間を追跡するのに問題なく機能しますが、サイトを離れるとき(つまり、ブラウザが閉じている/終了しているとき)、問題が発生していて、それを見つける方法がわかりません。基本的に、endレコードはタイムスタンプで更新されていません。ブラウザが閉じているため、AJAX関数が正しく呼び出されていないようです。AJAX呼び出しでfalseに設定asyncしましたが、それは役に立ちません。

ユーザーがブラウザを閉じたときにこの関数が機能しないのに、onbeforeunloadイベントが発生した他のすべての時間に機能するのはなぜですか?

編集

エラーは単にのチェックがなかったということでしたelse if($_GET['when'] == "end")

これが私のコードです:

index.php:

// If the session DOES NOT EXIST, make it and set it to TRUE.
if(!isset($_SESSION['new_visit']))
{
    $_SESSION['new_visit'] = true;
}

// If the session is TRUE, make it false.
if($_SESSION['new_visit'] == true)
{
    $this->db->store_visit();

    $_SESSION['unique_session_id'] = hash("sha512", uniqid("", true) . uniqid("", true) . uniqid("", true));

    $_SESSION['new_visit'] = false;
}

index.phpの下部:

<script type="text/javascript">

    if(window.addEventListener)
    {
        window.addEventListener("load",         function(){log_time("start");}, false);
        window.addEventListener("beforeunload", function(){log_time("end");  }, false);
    }

    function log_time(time)
    {
        var xmlhttp = "";
        var session = "<?php echo $_SESSION['unique_session_id']; ?>";

        // IE7+, Firefox, Chrome, Opera, Safari.
        if (window.XMLHttpRequest)
        {
            xmlhttp = new XMLHttpRequest();
        }
        // IE6, IE5.  
        else
        {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }

        xmlhttp.open("GET", "/application/logtime.php?session=" + session + "&when=" + time, false);
        xmlhttp.send();
    }

</script>

logtime.php:

//session_start();

require "database.php";

$db = new Database();

$unique_id = $_GET['session']; //$_SESSION['unique_session_id'];
$time      = time();

if($_GET['when'] == "start")
{
    if($get_rows = $db->mysqli->query("SELECT 1 FROM time_on_site WHERE unique_id = '$unique_id'"))
    {
        $rows = $get_rows->num_rows;
    }

    // If rows were afffected, the unique ID has already been stored so we must UPDATE. This happens each time a page is refreshed.
    if($rows >= 1)
    {
        $db->mysqli->query("UPDATE time_on_site SET end = '$time' WHERE unique_id = '$unique_id'");
    }

    // Else if the rows affected were 0, we must INSERT a new record. This happens once per session (visit).
    else
    {
        $db->mysqli->query("INSERT INTO time_on_site(start, unique_id) VALUES('$time', '$unique_id')");
    }
}
4

1 に答える 1

1
if($_GET['when'] == "start")
{
    // ...
}

この条件にはelseブランチがないため、の場合$_GET['when'] != "start"、何も起こりません。

于 2013-01-21T16:46:16.080 に答える