Signaler

Empêcher le double envois des données d'un formulaire? [Résolu]

Posez votre question Zick__barrimor 57Messages postés jeudi 31 juillet 2014Date d'inscription 18 septembre 2016 Dernière intervention - Dernière réponse le 17 sept. 2016 à 19:58
Bonjour à tous!
Aujourd'hui je m'adresse a vous car je me trouve dans l'embarras.
Les utilisateurs de mon site doivent remplir un formulaire de contact, lequel m'est envoyé par mail. Jusque là il n'y a aucun problème.
En revanche si l'utilisateur s'amuse a rafraichir la page, ma boite mail se retrouve rapidement inondée. Mais j'y ai pensé!
J'ai modifié un code que j'ai trouvé sur le net, mais malheureusement le mail continue de s'envoyer meme après un refresh..
$reload = 0;
$reload = $_SESSION[$reload];
if($reload > 0) {
} else {
Try{
mail($destinataire,utf8_decode($object),utf8_decode($msg.$br.$br.$msg_disp),$header);
mail($expediteur,utf8_decode($object),utf8_decode($msg.$br.$br.$msg_disp),$header);
}
catch(Exception $e){
echo "Erreur: ", $e->getMessage(), "\n";
}
if ($suggestion2) {
Try{
mail($webmaster,utf8_decode($object_sugg),utf8_decode($suggestion2),$header);
}
catch(Exception $e){
echo $br.$br."Erreur: ", $e->getMessage(), "\n";
}
}
}
$_SESSION[$reload]++;
Si quelqu'un a l’amabilité de m'aider...!
Merci!
Afficher la suite 
Utile
+1
moins plus
Je te propose 2 solutions non exclusives :
- Ajout d'un input Hidden contenant une valeurqui est aussi renseignée dans la session, comme ça à la première validation du retire/change cette valeur et comme les valeurs ne concordent pas, tu refuse le formulaire.
- Après l'envoi du message, tu rediriges vars une page avec header("location ...?Success=true") par exemple.
Zick__barrimor 57Messages postés jeudi 31 juillet 2014Date d'inscription 18 septembre 2016 Dernière intervention - 17 sept. 2016 à 16:46
Salut et merci!

La redirection est déjà mise en place avec un javascript et commence au bout de 30s,
le soucis c'était le refresh

je vais essayer le input Hidden! merci
Répondre
NHenry 13416Messages postés vendredi 14 mars 2003Date d'inscription ModérateurStatut 24 septembre 2016 Dernière intervention - 17 sept. 2016 à 17:26
L'usage de header:location permet de ne pas conserver le retour arrière du navigateur, et il est plus simple de simplement rediriger directement.
Répondre
Ajouter un commentaire
Utile
+0
moins plus
d'ailleurs dans tous les cas, avec ou sans redirection rien n'empeche de revenir sur la page précédente et re-renvoyer le mail
Zick__barrimor 57Messages postés jeudi 31 juillet 2014Date d'inscription 18 septembre 2016 Dernière intervention - 17 sept. 2016 à 16:50
¨Par contre ça t'embeterais de m'écrire le code stp? Comme je connais pas trop l'input ^^ merci
Répondre
Ajouter un commentaire
Utile
+0
moins plus
Alors j'ai compris ou est le soucis:

$reload = 0;
$reload = $_SESSION[$reload];

je defeinis ici reload sur 0, pour lui attribuer une autre valeur plus tard. Le problème que ça pose, c'est que si la page est rafraîchie, reload se remet a nouveau a 0...

Donc il faudrait soit fractionner le code en deux page, soit verifier avant de le modifier si il n'a pas déjà une valeur.

Fractionner en deux pages je n'ai pas réussi jusque là (les variables ne communiquent visiblement pas d'une page a l'autre)

et le if je viens d'y penser en saisissant ma réponse, a voir.
Zick__barrimor 57Messages postés jeudi 31 juillet 2014Date d'inscription 18 septembre 2016 Dernière intervention - 17 sept. 2016 à 18:36
if ($reload !== 0) {
echo 'la valeur est '.$reload;
} else {
echo 'valeur placée sur 0';
$reload = $_SESSION['0'];
}

if ($reload < 0) {
echo 'Mail sent!';
Try{
mail($destinataire,utf8_decode($object),utf8_decode($msg.$br.$br.$msg_disp),$header);
mail($expediteur,utf8_decode($object),utf8_decode($msg.$br.$br.$msg_disp),$header);
}
catch(Exception $e){
echo "Erreur: ", $e->getMessage(), "\n";
}

if ($suggestion2) {
Try{
mail($webmaster,utf8_decode($object_sugg),utf8_decode($suggestion2),$header);
}
catch(Exception $e){
echo $br.$br."Erreur: ", $e->getMessage(), "\n";
}
}
} else {
echo 'Mail not sent!';
}

$reload = $_SESSION['0']++;
echo $reload;

Visiblement même comme ça ça ne fonctionne pas..
Répondre
Ajouter un commentaire
Utile
+0
moins plus
J'ai étudié l'usage du $_SESSION de façon plus approfondie, et finalement j'ai réussi!

//=====Envoi de l'e-mail.
session_start();
if ($_SESSION == null) {
$reload = $_SESSION["session_courante"] = 0;
if ($reload == 0) {
$reload = $_SESSION['session_courante'] = 1;
}
} else {
echo '2';
$reload = $_SESSION['session_courante'] = 2;
}

if ($reload == 1) {
Try{
mail($destinataire,utf8_decode($object),utf8_decode($msg.$br.$br.$msg_disp),$header);
mail($expediteur,utf8_decode($object),utf8_decode($msg.$br.$br.$msg_disp),$header);
}
catch(Exception $e) {
echo "Erreur: ", $e->getMessage(), "\n";
}

if ($suggestion2) {
Try{
mail($webmaster,utf8_decode($object_sugg),utf8_decode($suggestion2),$header);
}
catch(Exception $e){
echo $br.$br."Erreur: ", $e->getMessage(), "\n";
}
}
} else {
}
//=====

Le truc c'est qu'il faudrait que je trouve un moyen de détruire la session plus tard, un peu comme un timeout enregistré côté serveur (je ne veux pas utiliser les cookies, c'est pas fiable)

Parce que les sessions qui durent 10 minutes c'est pas terrible ^^
Ajouter un commentaire

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !