web-dev-qa-db-ja.com

PHP:ページの更新を検出する

ページがありますaction.phpコード上でSQLクエリを実行するため、ページが表示されるたびに、クエリはページビューのカウントのように実行されます

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

問題は、ページが更新されたときにクエリが実行され、PAGE REFRESHが回避したいページビューとしてカウントされることです。

質問:回避するにはどうすればよいですか?

私が探しているのは、チェックできるように簡単な解決策です

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

私は問題を解決しました...セッションもクッキーもない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
?>
2
Moon

私はこのスニペットを見つけました 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;
}
26

ページの更新を直接検出することはできませんが、Cookieを使用して必要なものをシミュレートできます。

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

要件に応じて、Cookieを削除するタイミングを決定したり、アクションを再度実行したりする必要があります。

10
casablanca

ページの更新を検出する最良の方法。か否か ?(Ctrl+F5F5Ctrl+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";
}
9

ユーザーに対して一度だけ実行したい場合は、セッションCookieを設定してから、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

これはあなたのシナリオで機能します:

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
iammark

現在のページに関連付けられるCookieを保存し、リンクをクリックした場合は、Cookieを新しいページ名で更新できます。上記がJavascriptで行われると仮定すると、このupdateCookie情報をサーバーに送信して、新しいページヒットについて通知できます。

または、別の方法として、HTTP HEADERを指定して、キャッシュが期限切れになるまでの時間を指定することができますページ上でそのようにすると、ブラウザはpage load/refreshに関するリクエストさえ送信しません。

キャッシュの詳細については http://www.mnot.net/cache_docs/#IMP-SCRIPT を参照してください

また、HTTPのEtagとExpiresも確認してください- ETag vs Header Expires

1
Sairam