防止在页面刷新时重新提交数据

时间:2012-12-07 作者:Androliyah

UPDATED FOR CLARIFICATION

我有一个不断提交的评级插件&;在页面刷新时复制分级数据。当用户想要添加评分时,他们必须单击一个按钮,进入“mysite.com/?review=true”

提交评论后,浏览器保持在“mysite.com/?review=true”状态

刷新浏览器后,将重新提交审阅,导致条目重复。

如何检查数据库中的重复项并停止此操作?

http://pastebin.com/c6wPGRD5 - 班php

http://pastebin.com/tz4PvWtS - 表单提交。php

http://pastebin.com/9ebCxpMZ - 插件。php

2 个回复
SO网友:EAMann

要防止多次单击按钮,可以使用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

SO网友:chrisguitarguy

&提交;在页面刷新时复制分级数据。

如果只是页面刷新问题,请在表单提交后重定向用户。这将阻止重新提交,因为浏览器当前的请求不是表单提交。快速示例:在表单处理程序中。。。

<?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;

结束