【问题标题】:how unset session when close the web page in php在php中关闭网页时如何取消会话
【发布时间】:2012-06-02 19:00:39
【问题描述】:

当我通过单击 [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"]);
}

【问题讨论】:

  • 您将在 sqli 地狱中直接将变量插入查询中。使用 PDO 或 mysqli 并将它们作为参数插入
  • 为什么不能让 JavaScript 函数检测用户何时离开?
  • 您是否尝试跟踪访问者在一个或多个会话中访问了哪些页面?他们登录了吗?
  • 有什么问题

标签: php javascript session browser


【解决方案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";
}
?>

【讨论】:

  • 您说:为什么不能让 JavaScript 函数检测用户何时离开? ,请问我该怎么做
  • @user1421634 我提到了onbeforeunloadJS事件,它在关闭或离开页面之前触发。
【解决方案2】:
session_set_cookie_params(0);
session_start()

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


澄清一下:

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

要回答直接问题 - 您无法跟踪用户何时关闭浏览器 - 即当他们按照 cmets 的要求点击“x”时。

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

所以你有四个选择:

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

2) 修改 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 回调,如果您在一分钟后没有收到回调,则假定浏览器已关闭,然后终止会话。 (需要相当多的处理!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    相关资源
    最近更新 更多