PHP: определить обновление страницы - PullRequest
17 голосов
/ 27 ноября 2010

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

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

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

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

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

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

Ответы [ 8 ]

26 голосов
/ 16 июля 2014

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

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

if($pageWasRefreshed ) {
   //do something because page was refreshed;
} else {
   //do nothing;
}
10 голосов
/ 27 ноября 2010

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

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

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

9 голосов
/ 17 мая 2016

Лучший способ обнаружить обновление страницы. или нет? ( 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";
}
6 голосов
/ 27 ноября 2010

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

<?php
session_start();

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

$_SESSION['loaded'] = true;

?>
3 голосов
/ 18 июня 2014
    //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
    }
2 голосов
/ 23 мая 2018

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

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

2 голосов
/ 27 ноября 2010

Я решил проблему ... УРА без сеанса и без файлов 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
?>
1 голос
/ 27 ноября 2010

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

Или другим подходом может быть, вы можете указать HTTP HEADER , который указывает, по истечении какого времени кеш истекает на странице, и таким образом, браузер даже не отправит вам запрос о загрузке / обновлении страницы .

См. http://www.mnot.net/cache_docs/#IMP-SCRIPT для получения информации о CACHING

Кроме того, проверьте Etag против Expires в HTTP - ETag против Expired Expires

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...