代码之家  ›  专栏  ›  技术社区  ›  Moon

php:检测页面刷新

  •  17
  • Moon  · 技术社区  · 14 年前

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

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

    问题是,当刷新页面时,运行查询&page refresh将被计为一个我希望避免的页面视图。

    问题: 如何避免?

    我要找的是一个简单的解决方案,这样我可以检查

    if( page was refresh ) //some condition
    {
     do
    }
    
    8 回复  |  直到 6 年前
        1
  •  26
  •   Gideon Rosenthal    10 年前

    我发现了这个片段 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;
    }
    
        2
  •  10
  •   casablanca    14 年前

    无法直接检测页面刷新,但可以使用cookie模拟所需内容:

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

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

        3
  •  8
  •   Mesabloo    8 年前

    检测页面刷新的最佳方法。是不是?( 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";
    }
    
        4
  •  6
  •   Rutger    14 年前

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

    <?php
    session_start();
    
    if (!$_SESSION['loaded'])
    {
        // insert query here
    }
    
    $_SESSION['loaded'] = true;
    
    ?>
    
        5
  •  3
  •   jim Jim    10 年前
        //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
  •  2
  •   Moon    14 年前

    我已经解决了这个问题…无会话和无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
    ?>
    
        7
  •  2
  •   Pete    6 年前

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

    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
  •  1
  •   Community CDub    7 年前

    您可以保存一个将与当前页面关联的cookie,如果单击了任何链接,则使用新的页面名称更新cookie。 假设上述工作是在 javascript ,您可以将此更新cookie信息发送到服务器,以通知有关新页面命中的信息。

    或者另一种方法可以是,您可以指定 HTTP头 它指定了在 缓存过期 通过这种方式,浏览器甚至不会向您发送有关 页面加载/刷新 .

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

    另外,在http中查看etag vs expires- ETag vs Header Expires