14

f5を押したときにフォームが再送信されるのを回避するために、サイトに次のコードを(phpとsmartyを使用して)持っています。

if ($this->bln_added == false) {
    if (isset($_POST['submit'])) {
        $this->obj_site->obj_smarty->assign('title', $_POST['tas_heading']);
        $this->obj_site->obj_smarty->assign('desc', $_POST['tas_description']);
    }
} else {
    $this->obj_site->obj_smarty->assign('title', '');
    $this->obj_site->obj_smarty->assign('desc', '');
    unset($_POST);
}

デフォルトでは bln_added は false ですが、フォームが正常に送信されると true に変わります。smarty 変数の title と desc は、ユーザー エラーが発生し、入力内容を変更する必要がある場合にフォームのコンテンツを保持するためにテンプレートで使用されます。

フォームが正常に送信されると、bln_added = true が設定されるため、コードの 2 番目のビットはフォーム フィールドをクリアするだけでなく、$_POST も空にする必要があります。しかし、f5 を押すと、投稿データはまだそこにあります。

何か案は?

4

11 に答える 11

10

解決策は、一般的にPost/Redirect/Getとして知られているパターンです

于 2009-04-06T18:45:33.933 に答える
2

form-submit を AJAX-way に書き直すことができます。HTML コンテンツを表示する必要がある場合は、JSON 形式で返し、JavaScript (jQuery など) で挿入します。

于 2014-10-17T05:32:32.530 に答える
1

たとえば、データを保存した後など、コードの最後で header() または exit() を使用すると、うまくいきます。

于 2015-09-13T03:09:28.130 に答える
1

私はこれを(PHPで)解決しました:

  1. time() に基づいていない一意の識別子 (id+counter) をフォームに追加します (!!!)

  2. その一意の識別子を持つセッションをチェックした別のファイル (postform.php) に投稿します。

  3. a) 一意の識別子を持つセッションが見つからなかった場合: データベースに投稿し、セッションに一意の識別子を入力します

    b) 一意の識別子を持つセッションが見つかった場合: 何もしない

  4. 3a/3b のいずれかがヘッダー付きの結果ページにリダイレクトした後 ('Location: http://mydomain.com/mypage ')

結果は次のとおりです。
更新/戻るボタンで再送信アクションはなく、戻るボタンをダブルクリックすると警告が再送信されるだけです (ただし、再送信アクションはありません)。

于 2011-12-19T10:24:25.417 に答える
0

投稿後のヘッダー リダイレクトは必要ですが、不十分です。

フォームを正常に送信した後、PHP 側でリダイレクトを実行します。例えば。header('場所: http://www.example.com/form.php ');

しかし、それだけでは十分ではありません。一部のユーザーは、リンクを 2 回 (ダブルクリック) 押します。最初のクリック後に送信ボタンを無効にする JavaScript が必要です。

于 2011-11-27T16:44:19.750 に答える