[英]AJAX function onBeforeUnload doesn't work
我正在跟踪单个用户在我的网站上的时间长度。 为了实现这一点,我记录了用户首次加载页面以及每次单击新页面时的时间戳。
简要总结:
数据库表(time_on_site):
+-------+-----+-----------+----+
| start | end | unique_id | id |
+-------+-----+-----------+----+
start
插入INSERT时间戳(仅一次)。 onbeforeunload
事件时, onbeforeunload
end
更新时间戳。 这对于跟踪浏览网页时他们在网站上的时间效果很好,但是当他们离开网站时(即浏览器已关闭/退出),就出现了问题,我不知道如何找到它。 基本上, end
记录不会随时间戳更新。 就像AJAX函数未正确调用一样,因为浏览器正在关闭。 我在AJAX调用中将async
设置为false,但这无济于事。
为什么当用户关闭浏览器时此功能不起作用,而在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')");
}
}
if($_GET['when'] == "start")
{
// ...
}
此条件缺少else
分支,因此如果$_GET['when'] != "start"
,则不会发生任何事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.