0

私はこの問題に対する答えを探し回っており、おそらく間違った方法で物事を進めてきたという事実をゆっくりと受け入れていますが、ここに役立つかもしれないいくつかの素晴らしい知恵の真珠の要求があります!

左側にディレクトリスタイルのナビゲーションバーがあるWebサイトで作業しています。したがって、最初は2つのディレクトリ(文法/語彙-英語学習サイト)のみが表示され、ディレクトリをクリックすると、その内容(他のページまたはディレクトリ)が表示されます。

私がこれを機能させる方法は、各ディレクトリがクリックされたときにページをリロードするフォーム送信ボタンですが、フォルダを開くか閉じるようにサイトに指示する$ _POSTの値を持ちます(これは$ _SESSIONの配列内で行われます) 。それは素晴らしい働きをします!ただし、問題は、ユーザーがブラウザの[戻る]ボタンをクリックすると、データを再送信するかどうかを尋ねるプロンプトが表示されることです。これは私が望んでいることではありません。

戻るボタンが押されたかどうかをPHPで検出できる方法があるかどうか疑問に思っていたので、ページをリロードしてサイドバーに変更を加える代わりに、サイドバーは同じままで、代わりにユーザーは彼らが最後に訪れたページ。

これに対する本当の解決策はおそらくサイドバーを再考することであると私は知っています、そしてそれを行うためのより良い方法についてのアドバイスも大いにありがたいです!

マイケル

4

3 に答える 3

4

プロンプトが表示される理由は、送信されるデータが何かを変更する場合にPOSTが使用されることになっているため、戻るボタンを使用してPOSTリクエストを送信すると、予期しない動作(データの重複など)が発生する可能性があるためです。

POSTをGETに置き換えると、プロンプトが無効になります。

HTML
From:

<form action="page.php" method="post">
</form>

に:

<form action="page.php" method="get">
</form>

PHP
参照をから$_POST['']に変更$_GET['']

于 2011-02-19T17:26:26.157 に答える
1
<?php
        session_start();        
        if( $_GET['t'] == $_SESSION['token'] ||  $_SESSION['directory'] == $_GET['q'] || !isset($_GET['q']) ) { 
          echo "<h1><span>you going</span> forward</h1>";
        } else {
          echo "<h1><span>you going</span> backward</h1>";
          echo "<p>should be <strong>{$_SESSION['directory']}</strong> directory</p>";
        }        
           $token = uniqid();  
           $_SESSION['token'] = $token;
           $_SESSION['directory'] = $_GET['q'];  
?>

<a href="index.php?q=grammar&t=<? echo $token; ?>">grammar</a>
<a href="index.php?q=vocabulary&t=<? echo $token; ?>">vocabulary</a>

于 2011-02-19T17:28:31.957 に答える
0

Web開発の原則として、再送信したくないデータ、またはサーバーのログに表示したくないデータを送信する場合にのみ、投稿を行う必要があります。また、投稿を行ったら、getパラメータまたはその他のメソッドを使用してリダイレクトする必要があります。

postの代わりにgetパラメータを使用する場合は、ページナビゲーションをステートレスにして、要求されたページをフェッチするだけです。

戻るボタンが押されたかどうかを検出する方法はありますが、一貫して作業を行うのは難しく、ユーザーを苛立たせる可能性があるため、別の方法で行うことをお勧めします。

于 2011-02-19T17:24:16.650 に答える