Empêcher le double envois des données d'un formulaire?

Résolu/Fermé
Zick__barrimor Messages postés 62 Date d'inscription jeudi 31 juillet 2014 Statut Membre Dernière intervention 18 septembre 2016 - 17 sept. 2016 à 16:35
Zick__barrimor Messages postés 62 Date d'inscription jeudi 31 juillet 2014 Statut Membre Dernière intervention 18 septembre 2016 - 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!
A voir également:

4 réponses

NHenry Messages postés 15175 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 25 décembre 2024 350
17 sept. 2016 à 16:39
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.
1
Zick__barrimor Messages postés 62 Date d'inscription jeudi 31 juillet 2014 Statut Membre Dernière intervention 18 septembre 2016 7
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
0
NHenry Messages postés 15175 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 25 décembre 2024 350
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.
-1
Zick__barrimor Messages postés 62 Date d'inscription jeudi 31 juillet 2014 Statut Membre Dernière intervention 18 septembre 2016 7
17 sept. 2016 à 16:49
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
0
Zick__barrimor Messages postés 62 Date d'inscription jeudi 31 juillet 2014 Statut Membre Dernière intervention 18 septembre 2016 7
17 sept. 2016 à 16:50
¨Par contre ça t'embeterais de m'écrire le code stp? Comme je connais pas trop l'input ^^ merci
0
Zick__barrimor Messages postés 62 Date d'inscription jeudi 31 juillet 2014 Statut Membre Dernière intervention 18 septembre 2016 7
17 sept. 2016 à 18:29
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.
0
Zick__barrimor Messages postés 62 Date d'inscription jeudi 31 juillet 2014 Statut Membre Dernière intervention 18 septembre 2016 7
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..
0
Zick__barrimor Messages postés 62 Date d'inscription jeudi 31 juillet 2014 Statut Membre Dernière intervention 18 septembre 2016 7
17 sept. 2016 à 19:58
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 ^^
0