2011-09-12 81 views
1

我對某些PHP代碼有一些困惑。我正在處理的網站有一個「返回上一頁」選項,我希望它的行爲非常像瀏覽器的後退按鈕。就目前而言,我使用$ _SESSION變量來跟蹤當前頁面和前一頁面的內容。我也對變量進行了「刷新校驗」,這樣我就不會以前面的和當前的頁面都相同了。執行PHP:檢測鏈接被點擊的時間

所以這裏的問題: 當前實現,如果我去一個頁面,說:「register.php」,然後進入「forgot.php」,以前的頁面中將「register.php」,這是精細。但是,如果我點擊「返回上一頁」,我會返回到「register.php」,前一頁是「forgot.php」,現在留給我一個2頁循環,並返回。

我試過實現SplQueue來幫助我跟蹤變量,並且試着在我的鏈接中使用dequeue()函數來獲取最後一頁顯示爲鏈接。問題出現在實際調用出列時,並導致元素消失,因此如果刷新,元素不再處於隊列中,鏈接也會更改。我通過「刷新校對」功能來調整這個功能,該功能爲我調用了出列隊列,並且它按照我的意願工作。問題現在是前向鏈接。如果我把自己指向另一個頁面,我不希望舊的鏈接出列信息。

例如: 我在register.php上,我的上一頁是「forgot.php」。 「返回到上一頁」鏈接準確地顯示「forgot.php」是它將直接訪問的頁面,但現在它不再處於隊列中,因此,如果我轉到其他頁面,請說「profile.php」,然後使用返回按鈕返回到「register.php」,它將不再顯示「forgot.php」作爲您將要去的頁面,如果您再次點擊「返回上一頁」。

所以,我想我的問題是,我真的可以做一個鏈接調用一個PHP函數,而實際上調用該函數直到鏈接被點擊。我試過讓鏈接指向JavaScript函數,但JS函數傾向於告訴我,我的隊列是空的,這是完全錯誤的。

請注意,這些頁面是HTML和PHP的混合體。 HTML提供給我,並且我一直在添加PHP以向字段添加功能並從數據庫獲取數據。如果必須使用PHP來回顯HTML鏈接,並且可以使用小的<?php someCode(); ?>以HTML格式完成,那麼我沒有問題。

我感謝你的時間來嘗試和幫助我。

編輯:

所以,試圖澄清一點,我有一個是目前跟蹤該用戶已經爲他們訪問他們網頁的結構。它創建了頁面的迷你歷史。我的問題是,我有這樣的代碼:

<a href="somelink">Back To Previous Page</a> 

而且我不知道什麼是「somelink」,是因爲它會根據您的歷史變化。我知道我可以這樣做:

<a href="<?php someFunction() ?>">Back To Previous Page</a> 

如果我做任何事情,就像上面,該功能在頁面執行時被顯示出來,所以就很難再次使用array_pop()dequeue()但是,在PHP將在頁面顯示後立即執行。我正在尋找的是一種顯示鏈接的方法,當且僅當單擊「返回上一頁」鏈接時,纔將其從歷史記錄中刪除。到目前爲止,我按照下面的建議在$_SESSION中存儲一個數組,因爲它是一個數組,所以我可以將數組中的最後一個元素顯示爲鏈接,所以唯一真正的問題是找到一種方法從元素中刪除元素點擊鏈接時的數組。

編輯2:

我一直在網上淘,並在使用JavaScript和AJAX調用PHP文件決定。這使我可以通過點擊我所擁有的鏈接來控制何時從我的$_SESSION['links']變量中獲得array_pop

我不認爲我的AJAX實際上是在做任何可悲的事情,所以我使用的代碼如下。

<script src="js/jquery-1.4.2.min.js" type="text/javascript"> 
function dequeue() 
{ 
    $.ajax({ 
      type: "POST", 
      url: "common.php", 
      data: {action: "rem"}, 
      success: function(output) { 
        alert(output); 
       } 
     }); 
} 
</script> 

和PHP是

switch($_POST['action']) 
{ 
case "rem": 
    array_pop($_SESSION['links']); 
    break; 
default: 
    if(isset($_SESSION['current']) && $_SESSION['current'] != $_SERVER['REQUEST_URI']) 
    { 
     array_push($_SESSION['links'], $_SESSION['current']); 
    } 

    $_SESSION['current'] = $_SERVER['REQUEST_URI']; 
    break; 
} 

據我所知,這將讓我添加在會話變量中的鏈接記錄,除非我點擊「返回上一頁「鏈接,因爲該鏈接將具有」rem「代碼。我也有點懷疑$_SESSION['current'] = $_SERVER['REQUEST_URI'];以及它應該放在哪裏。

+0

我不太明白這個問題,但標題很有趣。 PHP只在鏈接被點擊時執行(或者你有一些JS代碼發起一個請求,你也可以控制它)。 – NullUserException

+0

@NullUserException是的,點擊鏈接時會執行PHP,但我需要更多的方法來執行特定的功能並重定向到另一個頁面。所以一旦鏈接被點擊,轉到該頁面並執行一個特定的功能,將用於每個鏈接。但是,下面的解決方案擺脫了需要執行的功能 – Serneum

+0

我說謊了。除非有其他方式來檢測鏈接是否被點擊,否則似乎還需要一個功能。 – Serneum

回答

3

您可以將數組存儲在會話中並將數組視爲堆棧(相應地使用array_pusharray_pop)。當用戶點擊後退按鈕時,將當前頁面推送到堆棧。否則,彈出它。

+0

使用堆棧來存儲瀏覽數據是20世紀90年代。所有當前的瀏覽器都可以前後移動,所以堆棧並不能完全切斷它。 – NullUserException

+0

@NullUserException我真的不需要擔心前進,因爲「返回上一頁」是當前頁面上的鏈接,應該像瀏覽器的「後退」按鈕一樣,或者至少這是我喜歡它的方式去工作 – Serneum

+0

@LeleDumbo我會嘗試,因爲它似乎與下面發佈的答案一樣。很高興知道我可以根據需要推送/流行,並將它當作隊列或堆棧對待 – Serneum

0

我會做這樣的,如果我不得不:

$_SESSION["history"] = array(); 

而且每個「rememberable」頁的標題中:

if(in_array($this_page, $_SESSION["history"])) { 
    unset($_SESSION["history"][array_search($this_page, $_SESSION["history"])]); 
} 
array_push($_SESSION["history"], $this_page); 

這樣做的是:「如果頁面存在在歷史中,將它從任何地方刪除,並將其作爲歷史的最後一頁,如果沒有,就把它作爲歷史的最後一頁。這樣你就不會有任何循環。

+0

我對某些循環很好,只是沒有歷史被限制在兩頁之間,總是互相反彈。我本質上創建了一個相當於瀏覽器的後退按鈕,所以如果你註冊 - >忘記 - >註冊 - >索引,我希望能夠遵循該路線。移動已存在的頁面會留下奇怪的空白。在我的例子中使用第二組代碼可以讓我回到「忘記」的位置,但不會回到「註冊」之前。我很欣賞這個輸入,我一定會玩弄它。希望我可以把它工作 – Serneum

+0

我明白這是如何工作的,但我更多地尋找一種方法來確定用戶何時點擊了「返回上一頁」鏈接,以便我知道何時不添加到歷史。 – Serneum