web-dev-qa-db-ja.com

フォーム送信後にポスト変数を設定解除する

上記を行う方法はありますか?基本的に、フォームを一度送信した後で誰かが更新を押した場合に、フォームを再度送信したくない。その場合、ブラウザから尋ねられますが、フォームを再度送信しますか?この場合、unset($_POST['username'])は役に立ちますか?

10
roopunk

一部の投稿者がすでに言及しているように、post/redirect/getは良いオプションです。

私が考えるもう1つの方法は、dostuff.phpページにセッションを設定して、投稿がすでに行われたことを示すことです。毎回このセッション変数をチェックして、ページが更新されたためにページが再度ロードされているかどうかを確認してください。

<?php
    session_start();
    if(isset($_SESSION['indicator'])) 
    {
        /*
        dont do anything because session indicator says 
        that the processing was already done..

        you might want to redirect to a new url here..          
        */
    }   
    else
    {

        /*
        first set session indicator so that subsequent 
        process requests will be ignored
        */
        $_SESSION['indicator'] = "processed"; 

        //process the request here..
    }
    ?>

リダイレクト先のページで、セッション変数を設定解除して、フォームをもう一度再送信して、新しい投稿操作にすることができるようにします。これにより、新しいフォーム投稿が許可されますが、ページの更新により投稿操作ができなくなります

10
raidenace

中間ページを使用して操作を行い、リダイレクトします。

例えば:

mypage.php->フォームのあるページ

dostuff.php->フォームデータを受信して​​操作を行い、他のページにリダイレクトします。

リダイレクトを行うには:
「dostuff.php」の先頭に次の行を追加します:header("Location: mypage.php");

3
Pedro L.

このコードを使用

    if(isset($_POST)){
      header('location:'.$_SERVER['PHP_SELF']);
      die();
     }
2
Vijay Sankar

上で直面している問題は、具体的には Post/Redirect/Get で解決できます(そして解決する必要があります)。設定解除_POST問題は別のリクエストであるため、php側では効果がありません。

また、送信ボタンのダブルクリックにも対処する必要があります。これは、ボタンをクリックした後のフォーム送信を無効にするか、ランダムなトークンをフォームに配置してセッションに保存することで、クライアント側で解決できます。トークンは1回だけ受け入れられます(セッションは、トークンが投稿されたかどうかを追跡します)。

2
Explosion Pills

これは、ユーザーが同じデータを2回送信しないようにするために使用する素晴らしい方法です。これにより、リロード時にページがデータベースに同じレコードを追加することも防止されます。

// First IF
if ($_SESSION['dup_comment_body'] == $_POST['comment_body']) { 
    echo 'You already entered that.';
} else {
    // Second IF
    if ($_POST['comment_body']) {

        // Run your query here

    $_SESSION['dup_comment_body'] = $_POST['comment_body']; 
    header('location:'.$_SERVER['REQUEST_URI'].'');
    }
} 

最初のIFは、$_POSTが最後に入力したもの($_SESSION)と等しいかどうかを確認します。同じでない場合は、次のIFを実行して、$_POST変数が空でないかどうかをテストします。最後のIFの下部に向かって、$_SESSION['dup_comment_body']$_POSTと等しくなるように設定します。したがって、次に最初のIFが実行され、$_POSTが同じである場合、「あなたはすでに入力しました」というメッセージが表示されます。お役に立てれば!

1
user1661548

フォームがデータベースを更新する場合、レコードが存在しない場合にのみ更新または挿入できます。最初にselectステートメントを実行するだけです。これにより、更新による重複レコードが防止されます。

0
Robert

これには POST/REDIRECT/GETパターン を使用する必要があります。

Post/Redirect/Get(PRG)は、フォーム送信の重複を防ぎ、ユーザーエージェント(ユーザー)により直感的なインターフェイスを作成するWeb開発設計パターンです。 PRGは、重複するフォーム送信を作成しない予測可能な方法でブックマークと更新ボタンをサポートします。

WebフォームがHTTP POSTリクエストを介してサーバーに送信されると、特定のユーザーエージェントでサーバーの応答を更新しようとするWebユーザーが、元のPOSTリクエストが再送信されるため、Web購入の重複など、望ましくない結果が発生する可能性があります。

この問題を回避するために、多くのWeb開発者はPRGパターンを使用します。Webページを直接返すのではなく、POST操作はリダイレクトコマンドを返します。HTTP1.1仕様では、HTTP 303(「他の")応答コードを使用して、この状況でWebユーザーのブラウザーが最初のPOST要求を再送信することなくサーバー応答を安全に更新できるようにします。ただし、今日使用されている最も一般的な商用アプリケーション(新しい古いものも同様)これらの状況でも引き続きHTTP 302( "Found")応答を発行します。

PHPの例を次に示します。

header('Location: /yourpage.php', true, 303);
exit;
0
John Conde