web-dev-qa-db-ja.com

ページ更新時にフォームの再送信を停止する方法

こんにちは私は投稿に添付ファイルを追加するフォームを持っていますが、フォームの投稿では明らかに「あなたのファイルはアップロードされました」とエコーする新しい添付ファイルで投稿を表示しません。ユーザーがページを更新すると(新しい添付ファイルを表示しようとすると)、フォームが再び投稿されます。

(1)更新時に再びフォームの投稿を停止する、(2)自動的にページを更新して新しい添付ファイル付きの投稿を表示することは可能ですか。 (2はずっといいです)

<?php $post_id = $post->ID;
if ( isset( $_POST['html-upload'] ) && !empty( $_FILES ) ) {
require_once(ABSPATH . 'wp-admin/includes/admin.php');
$id = media_handle_upload('async-upload', $post_id); //post id of Client Files page
unset($_FILES);
if ( is_wp_error($id) ) {
    $errors['upload_error'] = $id;
    $id = false;
}

if ($errors) {
    echo "<p>There was an error uploading your file.</p>";
} else {
    echo "<p>Your file has been uploaded.</p>";
}
}

?>
<form id="file-form" enctype="multipart/form-data" action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="POST">

<p id="async-upload-wrap"><label for="async-upload">upload</label>
<input type="file" id="async-upload" name="async-upload"> <input type="submit" value="Upload" name="html-upload"></p>

<p><input type="hidden" name="post_id" id="post_id" value="<?php echo $post_id ?>" />
<?php wp_nonce_field('client-file-upload'); ?>
<input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>" /></p>

<p><input type="submit" value="Save all changes" name="save" style="display: none;"></p>
</form>

ありがとうございます。 :)

5
ameeromar

の代わりに …

} else {
    echo "<p>Your file has been uploaded.</p>";
}

…成功したら別のアドレスにリダイレクトする:

} else {

    $new_url = add_query_arg( 'success', 1, get_permalink() );
    wp_redirect( $new_url, 303 );
}

ステータスコード303がGET要求をトリガーしています

このメソッドは主にPOST起動スクリプトの出力が選択されたリソースにユーザーエージェントをリダイレクトすることを可能にするために存在します。新しいURIは、最初に要求されたリソースの代わりの参照ではありません。 303レスポンスはキャッシュされてはならない(MUST NOT)が、2番目の(リダイレクトされた)リクエストに対するレスポンスはキャッシュ可能かもしれません。

フォームハンドラで、まず$_GET['success']が設定されていてその値が1であるかどうかを確認してから、成功メッセージを出力します。訪問者は何度も何度もこのページをリロードすることができます - そして何も送信されません。

6
fuxia

私は同じ問題を抱えていました、そして、私がすべてのURLを単一の.phpファイルにリダイレクトするという事実によって、それは「複雑」でした。 HTMLをページに書き込む前に、次のコードを挿入するだけで解決できました。

<?php
if (isset($_POST['mypostvar']) && isset($_SERVER['REQUEST_URI']))
{
    [process the post data in 'mypostvar']
    header ('Location: ' . $_SERVER['REQUEST_URI']);
    exit();
}
?>

ポストデータが希望通りに処理された後、これは同じページにリダイレクトします。リダイレクト後、元のポストデータは消え、再送信はトリガーされません。関数 'header()'は、何かがページに書き込まれる前に挿入した場合にのみ機能します。 exit()が必要です。

Header()を配置する前に投稿データを処理する必要があります。

1
Hans Hokke

私が見つけた最良の方法はjavascriptとcssを使うことです。一般的なphpリダイレクトメソッドのヘッダ( 'Location: http://www.yourdomain.com/url );うまくいきますが、異なるフレームワークやワードプレス、drupalなどのcmsで "警告:ヘッダ情報を変更できません - ヘッダは既に送信されています"という警告が表示されます。

echo '<style>body{display:none;}</style>'; 
echo '<script>window.location.href = "http://www.siteurl.com/mysuccesspage";</script>'; 
exit;

スタイルタグは重要です。そうでなければ、ユーザーはページが2回読み込まれるように感じるかもしれません。本文表示なしでスタイルタグを使用してからページを更新すると、ユーザーエクスペリエンスはphpヘッダー( 'Location:....)と同じになります。

これが役に立つことを願っています:)

0
Ajith

フォームを処理する前に、POSTを介してページが更新されたことを確認するために$_SERVER['REQUEST_METHOD'] === 'POST'をテストすることもできます。

if ( $_SERVER['REQUEST_METHOD'] === 'POST' )
{
   // Do Stuff
}
0
Jake

より簡単な方法は、あなたのフォームからアクションを削除し、隠されたアクションを持つことです。例えば、

<html>
<form action="" method="post><input type="text" name="name" />
<input type="submit" value="Submit" />
<input type="hidden" name="action" value="Submit" />
</form>
</html>

フォームが送信されたかどうかをチェックするために、コントローラに有効性と送信のチェックを依頼します。

<?php 
if (isset($_POST['action']) && $_POST['action'] == 'Submit'){
   //you should add code to validate user input here
   //if all ok submit the form
   header('Location: .'); //redirects to the controller without resubmitting
}
?>

この方法は、管理者ページでレコードを追加または削除するスクリプトで非常に役立ちます。再送信せずにページを再ロードし、削除または追加されたレコードを削除するかページに追加するためです。

0
timmac15

私はこれをtemplate_redirectアクションを使って解決しました(プラグインかテーマのfunctions.phpファイル)。

add_action('template_redirect','myfunction') ;

function myfunction() { 
  global $post;
  $post_id = $post->ID;
  if ( isset( $_POST['html-upload'] ) && !empty( $_FILES ) ) {
     require_once(ABSPATH . 'wp-admin/includes/admin.php');
     $id = media_handle_upload('async-upload', $post_id); //post id of Client Files page
     unset($_FILES);
     if ( is_wp_error($id) ) {
        $errors['upload_error'] = $id;
        $id = false;
    }

  }
  $error = ($errors) ? 1 : 0;
  wp_redirect( "/?p={$post_id}?errors={$error}",301);
}

それからあなたのページであなたはエラーをチェックすることができます

if ($_GET['errors']) {
    echo "<p>There was an error uploading your file.</p>";
} else {
    echo "<p>Your file has been uploaded.</p>";
}

(私はこのコードをテストしていません。それはあなたに良い出発点を与えるでしょう)。

0
Sunil

基本的に、一般的な考え方は、フォームの送信後にユーザーを他のページにリダイレクトしてページの更新時にフォームの再送信を停止することですが、フォームの送信後にユーザーを同じページに保持する必要がある場合は、複数の方法.

フォームデータの設定解除

ページの最新表示時にページの再送信を停止する1つの方法は、送信後にフォームデータをアンセットしてフォームデータを格納する変数を空にし、フォーム処理ブロックのコードをラップしてフォームが空かどうかを確認することです。

 if(!empty($ _ POST)&& $ _SERVER ['REQUEST_METHOD'] == 'POST'){
 $ data = //ここでコードを処理する
 unset $ data; 
} 

これにより、処理後に$ dataが空になり、最初の節でページの更新時にフォームの再送信が停止されます。

Javascript

この方法は非常に簡単で、フォームが送信された後に更新時にフォームの再送信を求めるポップアップをブロックします。このJavaScriptコード行をファイルのフッターに配置して、魔法を見てください。

 <script> 
 if(window.history.replaceState){
 window.history.replaceState(null、null、window.location.href); 
} 
 </script> 

このような質問の詳細については、このリンクにアクセスしてください。

0
Jiwan