0

当我通过单击 [x](不是 onunload)关闭页面时,如何取消设置 SESSION。我想在打开页面和关闭时插入,但我不想在刷新时插入。

if (!isset($_SESSION["visits"]))
    $_SESSION["visits"] = 0;
    $_SESSION["visits"] = $_SESSION["visits"] + 1;
if ($_SESSION["visits"] > 1){echo "You hit the refresh button!";}
else{
    mysql_query(
        "INSERT INTO najd_visit( visit_userId, visit_staticId, visit_page,
            visit_enterTime)VALUES ('$userId', '$Sid', '$title', '$date') ");
    echo "This is my site";
    //unset($_SESSION["visits"]);
}
4

2 回答 2

1

在页面加载的 JS 事件和离开(onbeforeunload事件)之前对您的 php 进行 ajax 调用。

更好地依赖像 jQuery 这样的 JS 库,因为两个事件侦听器的直接 JS 跨浏览器实现对代码来说非常棘手。

更新。感谢@piers 评论,我看到我的解决方案不完整,因为它会在页面刷新时计数。如果我正确理解任务,目标是计算页面打开和离开,而不是计算刷新事件。

所以,也许没有真正需要在页面关闭时取消设置会话 - 让它在服务器超时时自行消失?

您可以使用 session_id 来确定页面/会话对是否唯一。例如,您可以将访问过的页面 URL 保留在会话中,以检查您是否已将其计入:

<?php
$uri = $_SERVER['REQUEST_URI'];
if( is_set( $_SESSION['seen']) {
    if( !in_array( $uri, $_SESSION['seen'])){
        countup( $uri);
    } else {
        // already counted that page
    }
} else { // session doesn't have the seen array yet
    countup( $uri);
}

function countup( $uri) {
    $_SESSION['seen'][] = $uri;
    mysql_query( "
        INSERT INTO najd_visit 
        ( visit_userId, visit_staticId, visit_page, visit_enterTime)
        VALUES ('$userId', '$Sid', '$title', '$date')
    ");
    echo "This is my site";
}
?>
于 2012-05-28T12:01:50.977 回答
0
session_set_cookie_params(0);
session_start()

手册:http ://www.php.net/manual/en/function.session-set-cookie-params.php


澄清:

当用户不再访问您的站点时,您想终止会话吗?但是,如果他们留在您的网站上(后退按钮、前进等),那么您希望保留会话。

要回答直接问题 - 您无法跟踪用户何时关闭浏览器 - 即当他们点击“x”时,正如评论中所要求的那样。

您不能使用“onunload”,因为它发生在用户可能正在浏览您网站上的页面时。

所以你有四个选择:

1) 使用 cookie 手动控制您的会话,并将 cookie 设置为在浏览器会话结束时过期。

2) Mofify session_set_cookie_params(0) http://www.php.net/manual/en/function.session-set-cookie-params.php 所以当浏览器关闭时会话结束。

3) 将 php.ini session.cookie_lifetime 修改为 0(浏览器关闭时会话结束 - 与上面相同,但更全局)

4) 每 30 秒进行一次 ajax 回调,如果您在一分钟后没有收到回调,则假设浏览器已关闭,然后终止会话。(需要相当多的处理!)

于 2012-05-28T12:13:22.737 回答