web-dev-qa-db-ja.com

ページ更新時のデータ再送信を防止する

明確化のために更新されました

私はページの更新時に評価データを送信して複製し続けるこの評価プラグインを持っています。ユーザーが評価を追加したいときは、 "mysite.com/?review=true"に移動するためのボタンをクリックする必要があります。

レビューを送信した後、ブラウザは "mysite.com/?review=true"のままになります

ブラウザを更新すると、レビューが再送信され、エントリが重複します。

データベース内の重複をチェックしてこれを停止するにはどうすればよいですか。

http://Pastebin.com/c6wPGRD5 - class.php

http://Pastebin.com/tz4PvWtS - フォームsubmit.php

http://Pastebin.com/9ebCxpMZ - plugin.php

1
Androliyah

ボタンが複数回クリックされないようにするには、JavaScriptを使用してボタンを無効にします。

jQuery('#review_member_button').on('click', function(evt) {
    jQuery(this).attr('disabled', 'disabled');
});

WordPress側では、フォームが生成されるたびにフォームに一意のキーを設定し、そのキーを持つフォームが再送信されたかどうかを確認できます。一時的なもので、Batcacheのようなプラグインで簡単にキャッシュされるので、トランジェントを設定することをお勧めします。

フォームを作成するとき:

<?php
    $token_id = md5( uniqid( "", true ) );
?>

<form>
    ... Other form stuff
    <input type="hidden" name="token" value="<?php echo $token_id; ?>" />
</form>

それからあなたがあなたのフォームを処理するとき:

<?php
$token_id = stripslashes( $_POST['token'] );

// If the transient exists, this is a duplicate entry. So don't do anything
if ( ! get_transient( 'token_' . $token_id ) ) {
    return;
}

// If the transient doesn't exist, set it so we don't process the form twice
set_transient( 'token_' . $token_id, 'dummy-content', 60 ); // Cache for 1 minute

// ... do your other processing
1
EAMann

ページ更新時に評価データを送信して複製する。

ページの更新に関する問題だけがフォーム送信後のユーザーのリダイレクトです。ブラウザの現在のリクエストはフォームの送信ではなかったため、これによって再送信が防止されます。簡単な例:フォームハンドラの中では...

<?php
// your form handler someplace

// save the rating data.

wp_redirect($page_they_came_from, 303);
exit;

ユーザーが複数回投票しないようにする必要がある場合は、フォームハンドラーの最後にCookieを設定します(その後リダイレクトします。上記を参照)。

<?php
// you form handler someplace

// save rating data

$voted = isset($_COOKIE['_wp_voted']) ? explode(',' $_COOKIE['_wp_voted']) : array();

if(!in_array($the_item_for_voting, $voted))
{
    // save votes here.

    $voted[] = $the_item_for_voting;
}

setcookie(
    '_wp_voted',
    implode(',', $voted),
    time() + (60 * 60 *24), // one day
    '/', // the whole site
    COOKIE_DOMAIN, // this is set by WP, or in your wp-config.php
    false,
    true
);

wp_redirect($page_they_came_from, 303);
exit;
0
chrisguitarguy