beginner php
beginner php

Reputation: 27

how unset session when close the web page in php

How can I unset the SESSION when I close the page by clicking [x] (not onunload). I want to insert when opening the page and when closing, but I don't want to insert when refreshing.

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"]);
}

Upvotes: 0

Views: 1746

Answers (2)

Serge
Serge

Reputation: 1601

Make ajax calls to your php on JS events of page load and right before leave (onbeforeunload event).

Better rely on a JS library like jQuery, as direct JS cross-browser implementation of both event listeners is quite tricky to code.

Upd. Thanks to @piers comment I see my solution is not complete as it would count up on page refresh. If I understand the task correctly, the goal is to count page opens and leaves, not counting refresh events.

So, perhaps, there's no real need to unset the session on page close - let it vanish itself on timeout at server?

You can use session_id to determine if the page/session pair is unique. For instance, you can keep visited page URLs in session, to check if you already counted that in:

<?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";
}
?>

Upvotes: 1

Robbie
Robbie

Reputation: 17720

session_set_cookie_params(0);
session_start()

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


To clarify:

You want to kill a session when a user no-longer visits your site? But if they stay on your site (back button, forward etc) then you want to keep the session.

To answer the direct question - you can't track when a user closes the browser - i.e. when they click on the "x", as requested in the comments.

You can't use "onunload" because it happens when a user may be flicking to a page stil on your site.

So you have four options:

1) Manually control your sessions using cookies, and set the cookies to expire when the browser session ends.

2) Mofify session_set_cookie_params(0) http://www.php.net/manual/en/function.session-set-cookie-params.php so the session ends when the browser closes.

3) Modity php.ini session.cookie_lifetime to 0 (sessions end when the browser closes - same as above but more global)

4) Have an ajax call back every 30 seconds, and if you don't get a callback after a minute, assume the browser's been closed and then kill the sessions. (Requires quite a lot of handling!)

Upvotes: 0

Related Questions