web-dev-qa-db-fra.com

Empêcher la resoumission des données lors de l'actualisation de la page

MIS À JOUR POUR CLARIFICATION

J'ai ce plugin d'évaluation qui continue de soumettre et de dupliquer les données d'évaluation lors de l'actualisation de la page. Lorsqu'un utilisateur souhaite ajouter une note, il doit cliquer sur un bouton qui le dirige vers "mysite.com/?review=true".

Après avoir envoyé leur avis, le navigateur reste sur "mysite.com/?review=true".

Lors de l'actualisation du navigateur, la révision est soumise à nouveau, ce qui entraîne des entrées en double.

Comment puis-je vérifier les doublons dans la base de données et y mettre un terme?

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

http://Pastebin.com/tz4PvWtS - formulaire submit.php

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

1
Androliyah

Pour empêcher plusieurs clics de bouton, vous pouvez utiliser JavaScript pour le désactiver.

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

Sous WordPress, vous pouvez définir une clé unique pour le formulaire chaque fois qu'il est généré et vérifier si un formulaire avec cette clé a été soumis à nouveau. Je recommanderais de définir un transitoire, car ils sont temporaires et facilement mis en cache avec un plugin comme Batcache.

Lorsque vous construisez votre formulaire:

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

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

Ensuite, lorsque vous traitez votre formulaire:

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

soumettre et dupliquer les données d'évaluation lors de l'actualisation de la page.

S'il ne s'agit que d'un problème d'actualisation de page, redirigez l'utilisateur après la soumission du formulaire. Cela empêchera une nouvelle soumission, car la requête actuelle du navigateur n'était pas la soumission du formulaire. Exemple rapide: dans votre gestionnaire de formulaire ...

<?php
// your form handler someplace

// save the rating data.

wp_redirect($page_they_came_from, 303);
exit;

Si vous devez empêcher les utilisateurs de voter plusieurs fois, définissez un cookie à l'extrémité de votre gestionnaire de formulaire (puis redirigez-vous, voir ci-dessus).

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