我想检测是否使用 PHP 刷新了浏览器,如果刷新了浏览器,应该执行哪些特定的 PHP 代码。
6 回答
如果页面被刷新,那么您会期望两个请求彼此跟随,它们针对的是相同的 URL(路径、文件名、查询字符串)和相同的表单内容(如果有)(POST 数据)。这可能是相当多的数据,因此最好对其进行哈希处理。所以 ...
<?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;
}
在 AJAX 情况下,您必须小心将此代码放入哪些文件,以免更新异步调用的脚本的 LastRequest 签名。
当用户点击刷新按钮时,浏览器会包含一个额外的标题,该标题出现在 $_SERVER 数组中。
使用以下命令测试刷新按钮:
$refreshButtonPressed = isset($_SERVER['HTTP_CACHE_CONTROL']) &&
$_SERVER['HTTP_CACHE_CONTROL'] === 'max-age=0';
<?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"]);
?>
如果您的意思是要区分用户第一次访问该页面的时间和他们重新加载该页面的时间,请检查引荐来源网址。在 php 中是:$_SERVER["HTTP_REFERER"]。查看它是否与您的脚本正在运行的页面相同。可能是客户端不提供此信息的情况,如果发生这种情况,您可以设置 cookie 或会话变量来跟踪最后请求的页面是什么。
当用户点击浏览器刷新或返回按钮时,为了防止重复的表单处理,您需要使用页面实例 id 会话变量,以及包含该变量的隐藏表单输入。当两者不匹配时,则用户已刷新页面,您不应重新处理表单。有关详细信息,请参阅:
如果有人刷新页面,将发送与前一个相同的请求。所以你应该检查当前请求是否与上一个请求相同。这可以按如下方式完成:
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
);
我没有测试过它,但它应该可以工作。