2009-01-19 47 views
4

我想檢測瀏覽器是否刷新或不使用PHP,如果刷新瀏覽器,應執行哪些特定的PHP代碼。 請幫幫我。任何代碼片段都非常有幫助。PHP刷新

由於提前,

問候 納文

+0

如果你想防止副作用(一般的POST請求),該請求可以被髮送多次,你應該說這在你的問題。因爲這將採用與迄今爲止使用的答案不同的方法。 – Gumbo 2009-01-19 15:34:46

+0

贊同Gumbo。如果實際上你的目標是避免POST請求的副作用,那麼你應該使用GET重定向到一個新頁面。 – Wickethewok 2009-01-19 17:40:10

回答

12

如果頁面刷新,然後你會期望以下互相爲相同的URL(路徑,文件名,查詢字符串),和相同形式的內容(如果有的話)(POST數據)兩個請求。這可能是相當多的數據,所以最好對它進行散列。所以......


<?php 
session_start(); 

//The second parameter on print_r returns the result to a variable rather than displaying it 
$RequestSignature = md5($_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING'].print_r($_POST, true)); 

if ($_SESSION['LastRequest'] == $RequestSignature) 
{ 
    echo 'This is a refresh.'; 
} 
else 
{ 
    echo 'This is a new request.'; 
    $_SESSION['LastRequest'] = $RequestSignature; 
} 

在你必須要小心的AJAX情況有關哪些文件你把這個代碼放入,以免更新這是異步調用腳本LastRequest簽名。

+1

@naveen如果用戶在您的網站上打開了多個選項卡,在第一個選項卡上提交表單,在另一個選項卡上提交其他選項卡,關閉該選項卡,然後在第一個選項卡上刷新?上次請求可能並不總是有效。 – dqhendricks 2012-01-23 17:19:10

1

如果你的意思是你要當用戶第一次從當他們重新加載頁面檢查引用來的頁面之間進行區分。在PHP中它是:$ _SERVER [「HTTP_REFERER」]。看看它是否與您的腳本運行的頁面相同。可能是客戶端不提供此信息,如果發生這種情況,您可以設置cookie或會話變量來跟蹤上次請求的頁面。

3
<?php 

    session_start(); 
    if (!isset($_SESSION["visits"])) 
     $_SESSION["visits"] = 0; 
    $_SESSION["visits"] = $_SESSION["visits"] + 1; 

    if ($_SESSION["visits"] > 1) 
    { 
     echo "You hit the refresh button!"; 
    } 
    else 
    { 
     echo "This is my site"; 
    } 

    // To clear out the visits session var: 
    // unset($_SESSION["visits"]); 

?> 
+0

這當然不能保證他們點擊刷新按鈕。他們可能已通過(例如)您的網站的內部鏈接回到此頁面。 – Wickethewok 2009-01-19 17:37:56

+1

反對。這隻會檢測到對該網站的多次訪問。每次重載或導航到具有此腳本的另一個URL時,都會增加計數器。這對檢測頁面重新加載沒有用處。 – six8 2012-08-28 05:42:03

1

如果有人刷新頁面,將發送與上一頁相同的請求。所以你應該檢查當前請求是否與最後一個請求相同。

session_start(); 

$pageRefreshed = false; 
if (isset($_SESSION['LAST_REQUEST']) && $_SERVER['REQUEST_URI'] === $_SESSION['LAST_REQUEST']['REQUEST_URI']) { 
    if (isset($_SERVER['HTTP_REFERER'])) { 
     // check if the last request’s referrer is the same as the current 
     $pageRefreshed = $_SERVER['HTTP_REFERER'] === $_SESSION['LAST_REQUEST']['HTTP_REFERER']; 
    } else { 
     // check if the last request didn’t have a referrer either 
     $pageRefreshed = $_SERVER['HTTP_REFERER'] === null; 
    } 
} 

// set current request as "last request" 

$_SERVER['LAST_REQUEST'] = array(
    'REQUEST_URI' => $_SERVER['REQUEST_URI'], 
    'HTTP_REFERER' => isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null 
); 

我沒有測試它,但它應該工作:這可以如下完成。

+0

很好,謝謝! – 2014-01-16 22:21:37

1

爲了防止用戶點擊瀏覽器刷新或返回按鈕時出現重複表單處理,您需要使用頁面實例id會話變量以及包含該變量的隱藏表單輸入。當兩者不匹配時,則用戶已刷新頁面,並且不應該重新處理表單。對於進一步的細節,請參見:

https://www.spotlesswebdesign.com/blog.php?id=11

13

當用戶點擊刷新按鈕時,瀏覽器包括其中出現$ _SERVER陣列中一個額外的標頭。

測試使用下面的刷新按鈕:

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