web-dev-qa-db-fra.com

PHP: Détecter l'actualisation de la page

J'ai une page action.php sur lequel j'exécute une requête SQL via le code, de sorte que chaque fois que la page est consultée, la requête s'exécute comme c'est comme compter les pages vues

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

Le problème est que lorsque la page est actualisée, la requête est exécutée et PAGE REFRESH est compté comme une VUE DE PAGE que je veux éviter.

Question: Comment l'éviter?

Ce que je recherche, c'est une solution simple pour que je puisse vérifier

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

j'ai résolu le problème ... HURRAHHH sans session et sans cookies

la solution est une combinaison de PHP: AJAX: JavaScript

la requête que vous souhaitez exécuter sur le chargement de page et non sur la page Actualiser l'exécuter comme via AJAX call permet de dire ma fonction pour ce faire est

function runQUERY()
{
    xmlhttp=new XMLHttpRequest();
    xmlhttp.open("POST","doIT.php",false);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send();
}

et je peux simplement vérifier avec Javascript que la page est un nouveau chargement ou son rafraîchissement en procédant comme suit

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

et dans votre doIT.php simple ajoutez votre PHP que vous alliez mettre dans la page normale

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

J'ai trouvé cet extrait ici , et cela a parfaitement fonctionné pour moi:

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

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

Vous ne pouvez pas détecter directement une actualisation de page, mais vous pouvez utiliser un cookie pour simuler ce que vous voulez:

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

En fonction de vos besoins, vous devez également décider quand supprimer le cookie et/ou exécuter à nouveau l'action.

10
casablanca

Meilleure façon de détecter l'actualisation de la page. ou pas ?(Ctrl+F5,F5,Ctrl+REnter)

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

Si vous souhaitez simplement l'exécuter une fois pour un utilisateur, je définirais un cookie de session, puis utiliserais une instruction if ().

<?php
session_start();

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

$_SESSION['loaded'] = true;

?>
6
Rutger
    //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
    }
3
Jim

Cela peut fonctionner dans votre scénario:

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

Si l'utilisateur a un jeton dans l'URL, le nombre de vues ne sera pas mis à jour. Par conséquent, si l'utilisateur essaie d'actualiser, il ne mettra pas à jour le nombre de vues. Lorsque l'utilisateur n'a pas de jeton dans l'URL, le nombre de vues met à jour et actualise la page AVEC un jeton. C'est sortir des sentiers battus mais ça marche!

2
iammark

Vous pouvez enregistrer un cookie qui sera associé à la page actuelle et si vous cliquez sur un lien, mettez à jour le cookie avec le nouveau nom de page. En supposant que ce qui précède se fait en Javascript , vous pouvez envoyer ces informations updateCookie au serveur pour notifier un nouveau hit de page.

Ou une autre approche pourrait être, vous pouvez spécifier un EN-TÊTE HTTP qui spécifie après combien de temps le cache expire sur une page et de cette façon, le navigateur ne vous enverra même pas de demande concernant le chargement/rafraîchissement de la page .

Voir http://www.mnot.net/cache_docs/#IMP-SCRIPT pour plus d'informations sur la mise en cache

Consultez également Etag vs Expires dans HTTP - ETag vs Header Expires

1
Sairam