naveen
naveen

Reputation: 1451

Detect whether the browser is refreshed or not using PHP

I want to detect whether the browser is refreshed or not using PHP, and if the browser is refreshed, what particular PHP code should execute.

Upvotes: 5

Views: 19306

Answers (6)

Gumbo
Gumbo

Reputation: 655775

If someone refreshes a page, the same request will be sent as the previous one. So you should check whether the current request is the same as the last one. This can be done as follows:

session_start();

$pageRefreshed = false;
if (isset($_SESSION['LAST_REQUEST']) && $_SERVER['REQUEST_URI'] === $_SESSION['LAST_REQUEST']['REQUEST_URI']) {
    if (isset($_SERVER['HTTP_REFERER'])) {
         // check if the last request’s referrer is the same as the current
         $pageRefreshed = $_SERVER['HTTP_REFERER'] === $_SESSION['LAST_REQUEST']['HTTP_REFERER'];
    } else {
         // check if the last request didn’t have a referrer either
         $pageRefreshed = $_SERVER['HTTP_REFERER'] === null;
    }
}

// set current request as "last request"

$_SERVER['LAST_REQUEST'] = array(
    'REQUEST_URI'  => $_SERVER['REQUEST_URI'],
    'HTTP_REFERER' => isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null
);

I haven’t tested it but it should work.

Upvotes: 0

Rototechno
Rototechno

Reputation: 131

When the user hits the refresh button, the browser includes an extra header which appears in the $_SERVER array.

Test for the refresh button using the following:

    $refreshButtonPressed = isset($_SERVER['HTTP_CACHE_CONTROL']) && 
                            $_SERVER['HTTP_CACHE_CONTROL'] === 'max-age=0';

Upvotes: 13

dqhendricks
dqhendricks

Reputation: 19251

To prevent duplicate form processing when a user hits the browser refresh or back button, you need to use a page instance id session variable, and a hidden form input that contains that variable. when the two don't match, then the user has refreshed the page, and you should not reprocess the form. for further details, see:

https://www.spotlesswebdesign.com/blog.php?id=11

Upvotes: 1

Bell
Bell

Reputation: 18705

If the page was refreshed then you'd expect two requests following each other to be for the same URL (path, filename, query string), and the same form content (if any) (POST data). This could be quite a lot of data, so it may be best to hash it. So ...


<?php
session_start();

//The second parameter on print_r returns the result to a variable rather than displaying it
$RequestSignature = md5($_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING'].print_r($_POST, true));

if ($_SESSION['LastRequest'] == $RequestSignature)
{
  echo 'This is a refresh.';
}
else
{
  echo 'This is a new request.';
  $_SESSION['LastRequest'] = $RequestSignature;
}

In an AJAX situation you'd have to be careful about which files you put this code into so as not to update the LastRequest signature for scripts which were called asynchronously.

Upvotes: 13

user19302
user19302

Reputation:

<?php

    session_start();
    if (!isset($_SESSION["visits"]))
        $_SESSION["visits"] = 0;
    $_SESSION["visits"] = $_SESSION["visits"] + 1;

    if ($_SESSION["visits"] > 1)
    {
        echo "You hit the refresh button!";
    }
    else
    {
        echo "This is my site";
    }

    // To clear out the visits session var:
    // unset($_SESSION["visits"]);

?>

Upvotes: 2

Bjorn
Bjorn

Reputation: 71960

If you mean that you want to distinguish between when a user first comes to the page from when they reload the page check the referrer. In php it is: $_SERVER["HTTP_REFERER"]. See if it is equal the page your script is running on. It may be the case that the client doesn't provide this information, if that happens you could set a cookie or session variable to track what the last requested page was.

Upvotes: 1

Related Questions