PHP: обнаружение обновления страницы

у меня есть страницы action.php на котором я запускаю SQL-запрос через код, так что всякий раз, когда страница просматривается запрос выполняется как это как подсчет просмотров страниц

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

проблема заключается в том, когда страница обновляется, запрос запускается и обновление страницы считается видом страницы, которого я хочу избежать.

вопрос: как этого избежать ?

то, что я ищу, - это простое решение, чтобы я мог проверить

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

8 ответов


Я нашел этот фрагмент здесь, и это отлично сработало для меня:

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

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

вы не можете напрямую обнаружить обновление страницы, но вы можете использовать cookie для имитации того, что хотите:

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

в зависимости от ваших требований Вам также необходимо решить, когда удалить cookie и/или выполнить действие снова.


Если вы просто хотите запустить его один раз для пользователя, я бы установил файл cookie сеанса, а затем использовал оператор if ().

<?php
session_start();

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

$_SESSION['loaded'] = true;

?>

лучший способ обнаружения обновления страницы. или нет ?( Ctrl+Ф5,Ф5, 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";
}

я решил проблему ... HURRAHHH без сеанса и без куки

решение представляет собой комбинацию 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
?>

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

вы можете сохранить файл cookie, который будет связан с данной страницей, и если какая-либо ссылка нажата, обновите файл cookie с новым именем страницы. Предполагая, что вышеизложенное сделано в на JavaScript, вы можете отправить эту информацию updateCookie на сервер, чтобы уведомить о новом попадании страницы.

или другой подход может быть, вы можете указать ЗАГОЛОВОК HTTP это указывает, через сколько времени кэш истекает на странице и, таким образом, браузер даже не отправит вам запрос о загрузка/обновление страницы.

см.http://www.mnot.net/cache_docs/#IMP-SCRIPT для получения информации о кэшировании

кроме того, проверьте Etag vs истекает в HTTP -Etag vs заголовок истекает


Это может работать в вашем сценарии:

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-адресе, счетчик представлений обновляет и обновляет страницу с помощью маркера. Это нестандартное мышление, но оно работает!