PHP:检测页面刷新

Moo*_*oon 18 php refresh

我有一个页面action.php,我通过代码运行SQL查询,这样每当查看页面时,查询就像计算页面视图一样运行

<?php
mysqli_query("UPDATE ****");
?>
Run Code Online (Sandbox Code Playgroud)

问题是当刷新页面时,运行查询并将PAGE REFRESH计为我想要避免的PAGE VIEW.

   问题:如何避免它?

我正在寻找的是一个简单的解决方案,以便我可以检查

if( page was refresh ) //some condition
{
 do
}
Run Code Online (Sandbox Code Playgroud)

Gid*_*hal 26

我在这里找到了这个片段,它对我来说很有效:

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

if($pageWasRefreshed ) {
   //do something because page was refreshed;
} else {
   //do nothing;
}
Run Code Online (Sandbox Code Playgroud)

  • POST请求无法“刷新”。它只能再次发送。因此,chrome会以正确的方式执行此操作,并且不会发送等效的缓存头。@ user1032531 (3认同)
  • 不适用于Chrome浏览器和POST请求。 (2认同)

cas*_*nca 10

您无法直接检测页面刷新,但您可以使用cookie来模拟您想要的内容:

if (isset($_COOKIE['action'])) {
  // action already done
} else {
  setcookie('action');
  // run query
}
Run Code Online (Sandbox Code Playgroud)

根据您的要求,您还需要决定何时删除cookie和/或再次执行操作.


小智 9

检测页面刷新的最佳方法.或不?(Ctrl+ F5,F5,Ctrl+ R,Enter)

$pageRefreshed = isset($_SERVER['HTTP_CACHE_CONTROL']) &&($_SERVER['HTTP_CACHE_CONTROL'] === 'max-age=0' ||  $_SERVER['HTTP_CACHE_CONTROL'] == 'no-cache'); 
if($pageRefreshed == 1){
    echo "Yes page Refreshed";
}else{
    //enter code here
    echo "No";
}
Run Code Online (Sandbox Code Playgroud)

  • 使用 PHP 7.4.12 CGI 服务器本地开发机器和 Google Chrome 2020 年 11 月对我来说不起作用 (2认同)

小智 6

如果您只想为用户运行一次,我会设置会话cookie然后使用if()语句.

<?php
session_start();

if (!$_SESSION['loaded'])
{
    // insert query here
}

$_SESSION['loaded'] = true;

?>
Run Code Online (Sandbox Code Playgroud)


Moo*_*oon 3

我已经解决了这个问题... HURRAHHH 没有会话且没有cookie

解决方案是 PHP : AJAX : JavaScript 的组合

您想要在页面加载上运行而不是在页面刷新上运行的查询通过 AJAX 调用运行它,假设我执行此操作的函数是

function runQUERY()
{
    xmlhttp=new XMLHttpRequest();
    xmlhttp.open("POST","doIT.php",false);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send();
}
Run Code Online (Sandbox Code Playgroud)

我可以通过执行以下操作简单地使用 Javascript 检查该页面是新加载的还是刷新的

<head>
<script type="text/javascript">
function checkRefresh()
{
    if( document.refreshForm.visited.value == "" )
    {           
        // This is a fresh page load
            alert ( 'Fresh Load' );
        document.refreshForm.visited.value = "1";
            ..call you AJAX function here
    }
    else
    {
        // This is a page refresh
        alert ( 'Page has been Refreshed, The AJAX call was not made');

    }
}
</script>    
</head>

<body onLoad="checkRefresh()">

<form name="refreshForm">
<input type="hidden" name="visited" value="" />
</form>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

并在doIT.php中简单添加您要放入普通页面的 PHP 代码

<?php
mysql_query("UPDATE---------");
//put any code here, i won't run on any page refresh
?>
Run Code Online (Sandbox Code Playgroud)

  • 我不认为你在 FF 和 IE 中看到的这种行为是任何标准的一部分,并且它可能会发生变化,这些浏览器版本之间不一致,不面向未来等。Cookie 似乎是一个更重要的功能。可靠的解决方案。 (5认同)
  • 看起来当未启用 JavaScript 时这不起作用。 (5认同)
  • 这假设刷新后保留表单值 - 在 Firefox 和 IE 中是这样,但在 Chrome 中则不然。 (4认同)
  • 问卷的答案是错误的,并且误导了SO用户。 (3认同)
  • 事实上,Chrome 并没有做错什么,因为在页面刷新/后退/前进导航时没有保留表单值的指定行为。*正确的*方法是按预期呈现页面(通常是空白);某些浏览器可能会或可能不会保留表单值。非常有趣的黑客,至少部分有效。 (2认同)