【问题标题】:PHP: Detect Page RefreshPHP:检测页面刷新
【发布时间】:2011-05-16 11:16:21
【问题描述】:

我有一个页面action.php,我在该页面上通过代码运行 SQL 查询,因此每当查看该页面时,查询的运行就像就像计算页面浏览量一样

<?php
mysqli_query("UPDATE ****");
?>

问题是当页面刷新时,查询运行 & PAGE REFRESH 被计为我想避免的 PAGE VIEW。

   问题:如何避免?

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

if( page was refresh ) //some condition
{
 do
}

【问题讨论】:

  • 是否有任何 $_SERVER[''] 属性在从链接定向页面并刷新页面时会有所不同.. 如果是这样,那么解决这个问题就没有问题了跨度>
  • @Junaid Saeed:为了清楚起见,您是否也希望不计算用户浏览离开页面然后又浏览回来的次数?
  • $_SERVER 数组中的页面刷新没有变化,所以可以通过使用 Session 来完成
  • no.. 如果我想这样做,我会与我一起存储一些用户身份并计算不同的身份...
  • 仔细想想,我意识到这不应该由 PHP 来处理...

标签: php refresh


【解决方案1】:

我找到了这个 sn-p here,它非常适合我:

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

if($pageWasRefreshed ) {
   //do something because page was refreshed;
} else {
   //do nothing;
}

【讨论】:

  • POST 请求无法“刷新”。只能再次发送。因此 chrome 以正确的方式执行此操作,并且不发送等效的缓存标头。 @user1032531
【解决方案2】:

检测页面刷新的最佳方法。或不是?(Ctrl+F5,F5,Ctrl+R,回车)

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

【讨论】:

  • 使用 PHP 7.4.12 CGI 服务器本地开发机器和 Google Chrome 2020 年 11 月对我不起作用
【解决方案3】:

你不能直接检测页面刷新,但是你可以使用cookie来模拟你想要的:

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

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

【讨论】:

    【解决方案4】:

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

    <?php
    session_start();
    
    if (!$_SESSION['loaded'])
    {
        // insert query here
    }
    
    $_SESSION['loaded'] = true;
    
    ?>
    

    【讨论】:

    • 一旦设置了 $_SESSION['loaded'],我将无法在任何其他页面或具有不同参数的同一页面上进行此检查,例如您有水蛭页面...除非会话被销毁并且 ii 销毁会话,这意味着如果我的用户已登录,他\她将被注销...并且您在上面给出的这种语法将不起作用....正确的语法是
    • 我已经解决了,我已经发布了这个解决方案作为我自己问题的答案..
    【解决方案5】:
        //here you get the url behind the domain.
        $currentPage = $_SERVER['REQUEST_URI']; 
    
        //if the session current page is not set.
        if(!isset($_SESSION['currentPage'])){ 
    
          //set the session to the current page.
          $_SESSION['currentPage'] = $currentPage;     
        }
    
        //check if the session is not equal to the current page
        if($_SESSION['currentPage'] != $currentPage){
    
           // if it's not equal you set the session again to the current page.
           $_SESSION['currentPage'] = $currentPage;
    
           //set the query you want to use
        }
    

    【讨论】:

      【解决方案6】:

      我已经解决了这个问题...... 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();
      }
      

      我可以通过执行以下操作简单地使用 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>
      

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

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

      【讨论】:

      • 这假定表单值在刷新后保留——这在 Firefox 和 IE 中是正确的,但在 Chrome 中不是。
      • 我不认为你在 FF 和 IE 中看到的这种行为是任何标准的一部分,它可能会发生变化,这些浏览器版本之间的不一致,非面向未来,等等。Cookie 似乎是一个更可靠的解决方案。
      • 确实,Chrome 并没有做错任何事,因为在页面刷新/后退/前进导航中保留表单值没有指定的行为。 正确的 方式是按预期呈现页面(通常为空白);保留表单值是某些浏览器可能会或可能不会做的事情。非常有趣的 hack,但至少部分有效。
      • 当 javascript 未启用时,这似乎不起作用。
      • 问卷的答案是错误的,误导了SO用户。
      【解决方案7】:

      这可以在你的场景中工作:

      if(isset($_GET["token"])) {
          $view_token = $_GET["token"];
      } else {
          $new_views = $views + 1;
          // UPDATE VIEWS
          $view_token = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 5)), 0, 5);
          header("Location: ?token=$view_token");
      }
      

      如果用户在 URL 中有令牌,则观看次数不会更新。因此,如果用户尝试刷新,它不会更新视图计数。当用户在 URL 中没有令牌时,查看计数会更新并刷新带有令牌的页面。它跳出框框思考,但确实有效!

      【讨论】:

        【解决方案8】:

        您可以保存与当前页面关联的 cookie,如果单击任何链接,请使用新页面名称更新 cookie。 假设以上是在 Javascript 中完成的,您可以将此 updateCookie 信息发送到服务器以通知新的页面命中。

        或者另一种方法是,您可以指定一个 HTTP HEADER 来指定页面上的 缓存过期 多长时间后,浏览器甚至不会发送您对页面加载/刷新的请求。

        有关缓存的信息,请参阅http://www.mnot.net/cache_docs/#IMP-SCRIPT

        另外,请查看 HTTP 中的 Etag 与 Expires - ETag vs Header Expires

        【讨论】:

        • 同意cookie,但是当明确刷新页面时,浏览器通常会再次向服务器请求该页面,而不管缓存设置如何。
        【解决方案9】:
        if( $_SERVER['HTTP_CACHE_CONTROL'] == 'max-age=0')
        {
            $_SESSION['status'] = null;<br>
        }
        

        【讨论】:

          猜你喜欢
          • 2018-05-02
          • 2012-01-04
          • 2012-03-11
          • 2019-01-25
          • 1970-01-01
          • 2015-03-04
          • 2010-11-29
          • 2011-01-27
          • 2019-02-12
          相关资源
          最近更新 更多