2011-09-12 18 views
1

私はいくつかのPHPコードで少しのジレンマを持っています。私が取り組んでいるサイトには「前のページに戻る」オプションがあり、ブラウザの戻るボタンのように動作するようにしたいと思います。現状では、$ _SESSION変数を使用して、現在のページと前のページを追跡しています。私は変数を "リフレッシュプルーフ"して、前と現在のページが同じになることはありません。PHPを実行中:リンクがクリックされたことを検出

現在の実装では、1ページに移動して「register.php」と言ってから「forgot.php」に移動すると、前のページは「register.php」になります。良い。しかし、「前のページに戻る」をクリックすると、前のページが "forgot.php"となって "register.php"に戻り、2ページ分のループが戻ってきます。

変数を追跡するのに役立つSplQueueを実装しようとしました。最後のページをリンクとして表示するために、リンクでdequeue()関数を使用してみました。この問題は、デキューが実際に呼び出されたときに要素が消えるため、リフレッシュするとその要素はキューになくなり、リンクが変更されます。私はデキューを呼び出す関数を "リフレッシュプルーフ"することでこれを修正しました。これは、私が望むように動作します。この問題は現在、フォワードリンクされています。自分自身を別のページに誘導すると、古いリンクが情報をデキューしないようにします。

例: 私はregister.phpにあり、前のページは "forgot.php"です。 「前のページに戻る」リンクは正確に "forgot.php"が指示するページであることを示していますが、今はキューに入っていないので、別のページに行くと "profile.php"と言って戻るボタンを "register.php"に戻すと、もう一度 "前のページに戻る"を押すと、あなたが行くページとして "forgot.php"が表示されなくなります。

私の質問は、リンクがクリックされている間は実際にその関数を呼び出さずにPHP関数を呼び出すことができるということです。 JavaScript関数へのリンクポイントを試してみましたが、JS関数は自分のキューが空であることを教えていますが、これはまったく間違っています。

補足として、ページはHTMLとPHPが混在しています。 HTMLが私に供給されています。フィールドに機能を追加したり、データベースからデータを取得するためにPHPを追加しています。私はHTMLリンクをエコーするためにPHPを使用しても問題はありません。もしそれがHTMLで小さな<?php someCode(); ?>で実行できるのであれば、それも問題ありません。

私はあなたの時間をお手伝いしてくれてありがとう。

EDIT:

だから試してみて、ビットを明確にする、私は現在、ユーザーがすでに彼らはそれらを訪問するようになっていたページを追跡している構造を有しています。それはページのミニ履歴を作成します。

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

そして、私はそれはあなたの履歴に応じて変化しますので、「somelink」は何であるかを知らない:私の問題は、私は、このようなコードを持っているということです。 、私は上記のような何かをした場合、関数はページが表示されているように実行するので、それは難しい再びarray_pop()またはdequeue()を使用しますが、することができますされ

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

:私は、私のような何かを行うことができます知っていますPHPは、ページが表示されるとすぐに実行されます。私が探しているのは、「前のページに戻る」リンクがクリックされている場合にのみ、リンクを表示して履歴から削除する方法です。今のところ、私は$_SESSIONに配列を格納しています。これは配列であるため、配列の最後の要素をリンクとして表示できるので、実際の問題は要素を取り除く方法を見つけることですリンクがクリックされたときの配列

EDIT 2:

私は、インターネットを精練し、PHPファイルを呼び出すためにAJAXとJavaScriptを使用して時に決定されました。これは、私が変数からarray_popを制御できるように、私が持っているリンクをonClickしてくれます。

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

スタックを使用してブラウジングデータを保存するのは1990年です。現在のブラウザはすべて前方と後方に移動できるので、スタックはそれをかなりカットしません。 – NullUserException

+0

@NullUserException「前のページに戻る」は現在のページのリンクであり、ブラウザの「戻る」ボタンのように動作する必要があるため、私は前進することについて心配する必要はありません。 – Serneum

+0

@LeleDumbo私はそれがBenが下に投稿した答えと同じように見えるので、それを試してみます。私が必要に応じてプッシュ/ポップしてキューやスタックのように扱うことができることを知っておきましょう – 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

歴史はちょうどお互いに常に跳ね返っているわずか2ページに限られています。私は本質的にはブラウザの戻るボタンと同じものを作成したいと思いますので、もしregister-> forgot-> register-> indexに行くなら、そのルートに従いたいと思います。すでに存在するページを移動すると、奇妙なギャップが残されます。私の例で2番目のコードグループを使用すると、私は "忘れた"に戻ることができますが、それ以前の "レジスタ"に戻ることはできません。私は入力していただければ幸いです。うまくいけば私はそれを働かせることができます – Serneum

+0

私はこれがどのように動作するのか見ていますが、ユーザーが「前のページに戻る」リンクをクリックした時を特定する方法をもっと探しています。歴史。 – Serneum

関連する問題