6

ユーザーがページを更新して再度送信を選択したときにフォームを2回投稿するのを避けるために使用できる手法は何ですか?

たとえば、 regiter.php内にフォームがあり、register.php内でも処理します

まず、 register_process.phpなどの別のファイルで処理し、register.php にリダイレクトできます、約 20 の新しいページを作成し、多くのコードを再配置する必要があります。そのオプションは必要ありません。

2headersつ目は、正確なトリックを覚えていませんが、それでいくつかの悪い経験がありました-ユーザーはページを更新した後、ページに古いデータが表示されました...

3番目に、成功時にdummy.phpにリダイレクトし、dummy.phpからregister.php戻ることができます。その後、ページを更新してもブラウザは再投稿されませんが、戻るボタンを使用して再選択することはできません。投稿、ページの有効期限が切れる可能性があることは知っていますが、私とおそらく他のユーザーがページの期限切れエラーを表示するのは面倒です。

4番目に、ページが読み込まれると各フォームに一意の「アクセスキー」を使用します。これはフォームとともに投稿され、一度使用すると再利用できませんが、その機能のロジックに苦労しています。キーがMySQL DBに保存せずに使用されたことをどのように知ることができますか。ページを開いてからフォームを送信するまでに時間がかかるユーザーもいるため、時間ベースのアクセスもあまり良くないと思います。

ユーザーがフォームを再度再配置するのを避ける方法について、さらに提案が必要です。

4

5 に答える 5

3

これを試して:

<?php
session_start();
if( strcasecmp($_SERVER['REQUEST_METHOD'],"POST") === 0) {
  $_SESSION['postdata'] = $_POST;
  header("Location: ".$_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING']);
  exit;
}
if( isset($_SESSION['postdata'])) {
  $_POST = $_SESSION['postdata'];
  unset($_SESSION['postdata']);
}

これにより、基本的に POST データが保存され、ブラウザは GET リクエストとして再リクエストします。

于 2012-12-15T04:25:02.893 に答える
1

5番目。AJAX または jQuery を使用し、フォームがページ上でクリックされたときに、そのデータをバックグラウンドで送信します。画面に応答を出力します。そのフォームを送信済みとしてマークするか、セッションに保存すると、更新時にフォームを再度送信できなくなります。

私の意見では、とにかくそれを行うための最良の方法です。20 以上のフォームを持つスコアボードがあり、更新せずにデータを送信するのに非常にうまく機能しました。応答を返し、ページを非常にプロフェッショナルに見せることができます. jQuery を使用すると、優れたフォーム検証を使用して、必要なフィールドが送信されていることを確認することもできます。

于 2012-12-15T04:12:32.270 に答える
1

最善の解決策は次のようなものだと思います:
* 投稿されたデータの md5 または base64 を作成します
* このハッシュをセッション変数と比較します ($_SESSION['repost'] と呼びましょう)
* ハッシュが一致する場合は、この保存をスキップします実行して警告を出力する必要があります
* ハッシュが一致しない場合、またはハッシュが存在しない場合
* 現在のハッシュでセッション変数を割り当てます
* 保存する必要があることは何でも実行します

于 2016-01-04T14:41:34.797 に答える
0

最初のオプションを検討するとき、あなたのウェブサイトのデザイン (プログラミング デザイン ^^) についてはわかりませんが、必要なページは 1 つだけです。すべてのパラメーターを指定して redirect.php を呼び出すとします。コントローラーを呼び出す必要があり、コントローラーはパラメーターに関係なく、それらをどう処理するかを認識している必要があります。

プログラミング時に抽象化と優れた設計を行うことができるのは良い習慣であり、そのような状況で大いに役立ちます。

于 2012-12-15T04:22:29.107 に答える