1

この回答を得るために何を検索すればよいかわからなかった可能性があるため、これが既に処理されている場合は正しい投稿を教えてください。

さて、私は小さなカスタム CMS を持っており、ユーザーがページを更新して $_POST データを再送信しないようにしたいと考えています。だから私はこのようなことをしました:

<?
  //Start a session to hold variables I want after my redirect
  session_start();
  if($_POST){ 

    //Do some php stuff and if I'm happy with the results...
    $_SESSION['some_vars'] = $whatever;

    //Bring me back here but without the $_POST data
    header('Location: '.THIS_PAGE);
    exit;

  }
?>

スクリプトがリロードされると、セッション変数を使用してセッションを破棄します。

誰かがこれを処理するより良い方法を持っているかどうか疑問に思っています。それはかなり面倒ではありませんが、私は常により効率的な方法を探しています.

ありがとう。

編集:ちなみに、stackoverflow.comは、私がやっていることが不明確であると思われる場合に質問を投稿すると、どういうわけかこれを行いますが、その間にパーマリンクも作成します。

4

4 に答える 4

1

Post-Redirect-Get パターンと呼ばれるものを実際に実装しましたが、これは絶対に正しい方法です。私はこれを自分で行います。私はこれを頻繁に使用するので、通常はいくつかのマイナーなヘルパー関数をベース コントローラー クラスに実装して、使用しやすくしています。

public function prgRedirect($url = null, $sessionData = null)
{
    if ($sessionData !== null) {
        if (! isset($_SESSION)) session_start();
        $_SESSION['_PRG'] = $sessionData;
    }
    if ($url === null) $url = $_SERVER['HTTP_REFERER'];
    header("Location: ".$url);
}

public function getPrgData()
{
    if (! isset($_SESSION)) session_start();
    if (isset($_SESSION['_PRG'])) {
        $data = $_SESSION['_PRG'];
        unset($_SESSION['_PRG']);
    }
    else {
        $data = null;
    }
    return $data;
}

私は通常、REST スタイルの URL で使用するため、POST リクエストは必要なことを行い、 を使用してセッションにデータを保存prgRedirect()し、同じリソース/ページの GET URL にリダイレクトします。GET メソッドのハンドラーgetPrgData()は、実行の先頭で呼び出し、セッション データに何かがあるかどうかを確認します。

于 2010-01-10T19:55:35.600 に答える
0

ここには実際には2つの問題があります。

  • データがすでに保存されていて、データを保存するページが表示されているときに、ユーザーがブラウザの更新ボタンを押す
  • ユーザーはブラウザの「戻る」ボタンを押して、もう一度「送信」ボタンをクリックします。

header("location:somewhere_else.php")最初のシナリオでは、呼び出しを使用してユーザーをリダイレクトするGET-after-POSTパターンに従うのが最適なスキームです。このように、データを投稿したページがブラウザの履歴リストにないため、2回連続して呼び出されることを心配する必要はありません(サーバーが302ヘッダーを返したため)。

2番目のシナリオは、GET-after-POSTが役に立たないため、もう少し痛いです。ユーザーがフォームを2回送信した場合、データを2回保存できます。この場合、いくつかの解決策があります。

  • クライアントに送信するすべてのフォームに「フォーム識別子」(ランダムな文字列)を入れます。クライアントがフォームを送信するときに、セッションデータにそのような識別子がすでにあるかどうかを確認します。お持ちでない場合は、フォームデータを保存し、ユーザーのセッションで「使用済み」として識別子を覚えておいてください。セッションデータで識別子を見つけた場合は、何も保存しないでください。重複しています。
  • 送信された値とまったく同じ値がないかデータベースを確認してください。それらが一致する場合は、重複を保存しないでください。ただし、ユーザーが[戻る]ボタンをクリックし、データの一部を変更してから、フォームを再送信した可能性があります。
于 2010-01-10T20:27:52.167 に答える
0

ユーザーが同じデータを挿入しないことが重要な場合は、データベースに一意の列が必要であると確信しています(見出しなど)。この見出しがすでに存在するかどうかを確認してください。そのようにセッションを使用する必要はありません

于 2010-01-10T19:30:03.627 に答える
0


1. ランダムな文字列 (uniqid または md5) を生成します
。 2. それをセッションに保存し、フォームの非表示の入力に入れ
ます。 3. フォームの値とセッションの値を確認し、一致する場合はフォームを処理します。セッション値をクリアします。

于 2010-01-10T19:31:31.813 に答える