23

ここや他の場所で多くの投稿を検索しましたが、問題の解決策が見つからないようです。データベース エントリを表示するページがあります: database.php。これらのエントリはフォームでフィルタリングできます。それらをフィルタリングして、興味のあるものだけを表示すると、エントリをクリックして(リンクとして)、そのエントリページに移動できます(php GET経由)。そのエントリ ページ (つまり、"view.php?id=1") で戻るボタン (database.php に戻る) を押すと、フィルター フォームはフォームの再送信を確認する必要があります。これを防ぐ方法はありますか?

ここにいくつかの(簡略化された)コード例があります:

データベース.php:

<form>
    <select>
        <option>1</option>
        <option>2
        <option>
    </select>
    <input type="submit" name="apply_filter" />
</form>
<?php
if ( isset( $_POST[ "apply_filter" ] ) ) { // display filtered entries
    $filter = $_POST[ "filter" ];
    $q = "Select * from table where col = '" . $filter . "'";
    $r = mysql_query( $q );
} else { // display all entries
    $q = "Select * from table";
    $r = mysql_query( $q );
}
while ( $rec = mysql_fetch_assoc( $r ) ) {
    echo "<a href='view.php?id=" . $rec[ "id" ] . "'>" . $rec[ "name" ] . "</a><br />"; // this is where the link to the view.php page is...
}
?>

前述のように、リンクをクリックすると、「view.php?id=whatever」に移動します。そのページでは、URL から ID を取得して、その単一のエントリを表示します。

ビュー.php:

<?php
$id = $_GET[ "id" ];
$q = "Select * from table where id = '" . $id . "'";
$r = mysql_query( $q );
while (  ) {
    // display entry
}

?>

ここで [戻る] ボタンをクリックすると、database.php のフォーム (DB の結果をフィルター処理するために使用されるフォーム) で再送信の確認が必要になります。これは非常に煩わしいだけでなく、私にとっても役に立ちません。

どうすればこれを修正できますか? コード例と問題の説明が十分であることを願っています。そうでない場合はお知らせください。指定してみます。

4

9 に答える 9

9

これを行うには、2つの方法があります。簡単な方法と難しい方法。

方法に関係なく、状態ベースのページを処理している場合(を使用して$_SESSION)、ページを「ライブ」に保ち、制御下に置くために実行する必要があるのは、次のようなすべてのページのキャッシュを防ぐことです。

<?php
//Set no caching
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate"); 
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>

難しい方法は、IDを生成し、それを非表示の入力または&_SESSIONCookieとしてページのどこかに保存することです。次に、と同じIDをサーバーに保存します$_SESSION。それらが一致しない場合、一連の事前にプログラムされたif elseタイプステートメントにより、ページが再送信されても​​何も起こりません(これは、クリックして戻ったときに実行しようとします)。

簡単な方法は、次のように、フォームが正常に送信された場合に、ユーザーをフォーム送信ページにリダイレクトすることです。

header('Location: http://www.mydomain.com/redirect.php');

これがお役に立てば幸いです。

于 2013-03-05T15:05:09.473 に答える
3

役立つかもしれないことの 1 つは、フィルタ フォームで のGET代わりにメソッドを使用するようにすることですPOST

ブラウザーは通常、入力が自動的に再送信されるのを防ぎます。これは、入力が使用されているPOST場合には行われないことです。GETまた、これにより、ユーザーはフィルターを使用してページにリンクできるようになります。

于 2013-11-30T00:57:14.437 に答える
0

すでに上で述べましたが、もう一度言います。コードで session_start() を使用している場合は、次のようにヘッダーファイルに次の行を追加するだけです:-

<?php
header("Cache-Control: no cache");
?>

ただし、session_start() をまだ使用していない場合は、次のようにヘッダー ファイルに以下の行を追加できます。

<?php
header("Cache-Control: no cache");
session_cache_limiter("private_no_expire");
?>
于 2022-01-27T05:59:39.407 に答える