PHP:检测页面刷新

时间:2010-11-27 05:09:50

标签: php refresh

我有一个页面action.php,我在其中通过代码运行SQL查询,因此无论何时查看页面,查询都会像一样运行,就像计算页面浏览量一样

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

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

问题:如何避免?

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

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

9 个答案:

答案 0 :(得分:26)

我找到了这个代码段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;
}

答案 1 :(得分:10)

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

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

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

答案 2 :(得分:8)

检测页面刷新的最佳方法。或不?( Ctrl + F5 F5 Ctrl + R ,< kbd>输入)

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

答案 3 :(得分:6)

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

<?php
session_start();

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

$_SESSION['loaded'] = true;

?>

答案 4 :(得分:3)

    //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
    }

答案 5 :(得分:2)

我已经解决了这个问题......没有会话的HURRAHHH&amp;没有饼干

解决方案是PHP:AJAX:JavaScript

的组合

要在Page Load&amp ;;上运行的查询不在页面刷新运行它作为通过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
?>

答案 6 :(得分:2)

这可以在你的场景中使用:

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中没有令牌时,视图计数会更新并使用令牌刷新页面。它在盒子外面思考但它有效!

答案 7 :(得分:1)

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

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

有关CACHING

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

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

答案 8 :(得分:0)

if( $_SERVER['HTTP_CACHE_CONTROL'] == 'max-age=0')
{
    $_SESSION['status'] = null;<br>
}