bonsoir
j'ai un petit soucis avec plusieurs de mes formulaires, je me suis mis dans le peau d'un internaute qui clique partout et tout le temps :boxe:
j'ai donc double cliquer (voir meme triple cliqué) sur les bouton "submit" de mes formulaires, et le constat est logique: le formulaires est envoyé 2 voir 3 fois...
d'où mon questionnement:
comment eviter les doubles cliques ?
j'ai essayé dans des transaction, mais c'est débile je vous l'accorde...
quelle est la meilleur solution?
enregistrer en base de donnée ou en variable de session le timestamp du clique sur le bouton submit? c'est un peu lourdingue ca non ?
je sollicite une fois de plus vos avis éclairés
faites de beaux reves :harpe:
sur une de mes applis je log en session le timestamp de chaque requête et à chaque requête, si on en trouve 3 dans les dernieres 10 secondes je lui dis gentiment de patienter.
( bon c'est une appli lourde, donc 3/10 sec c'est peu mais nécéssaire )
par contre si tu veux l'empêcher de doublecliquer tu peux stocker le hash crc32() ( plus léger que md2 ou md5 ) de la requete et s'il envoie deux fois la même tu le préviens. Mais en logant le timestamp pour permettre deux fois la même action avec quelques secondes d'écart si ton jeu nécéssite des actions répétitives.
bon, ça c'est pour php.
Le mieux est peut-être de gérer en javascript, sur l'évènement submit d'un formulaire, tu stocke la date du submit et lors d'un sumbit suivant, si la date précédente est trop proche tu bloques.
Vu que c'est pas un problème de sécurité tu peux confier ça au client je pense.
Selon le formulaire, soit je le laisse faire, soit ça le bloque, il a qu'a s'éduquer tout seul et arrêter de cliquer comme un malade
Et bien déjà, tu peux commencer par désactiver le bouton à l'envoi, via Javascript (en mettant l'attribut
disabled="disabled" à ce bouton), en ajoutant un setTimeout() qui reactive le bouton après quelques secondes (en virant l'attribut). C'est plutôt efficace.
Côté serveur, tu peux tout simplement créer une variable de session que tu nommeras par exemple
last_form_submitted_at qui contient le timestamp du dernier envoi de formulaire, ainsi sur les formulaires
critique il est très simple de vérifier l'écart entre le timestamp courant et le timestamp du dernier envoi de formulaire.
Sephi-Chan
salut
merci pour vos reponses
je n'avais pas pensé au javascript...je vais mettre en place cette solution ainsi qu'un timestamp php (en base de donnée ou en session)
encore merci
bonne journée !
Tu peux utiliser un token qui rends ton formulaire utilisable qu'une fois.
A la génération de ton formulaire, tu génères un token que tu mets en session et dans un champ hidden.
A la validation du formulaire, tu compares le token du champ à celui de la session, tu le supprimes de la session.
Si ils sont identiques, tu traites les valeurs envoyées par le formulaire, sinon tu affiches un message d'erreur.
Avantage : Tu n'as pas de JS donc ca marchera tout le temps ^^
Inconvénient : 1 traitement supplémentaire (j'en vois pas d'autre
)
Pour ma part, je mets ça dans la plupart de mes formulaires, c'est simple à mettre en place et cela me semble le plus propre et le moins bidouille
merci je n'avais pas pensé au jeton, meme si je l'utilise pour les failles xss
sinon en js j'ai essayé ceci:
Code PHP :
<?php
<input type="submit" name="submit" value="Clique ici !" onSubmit="submit.disabled = true;">
mais cela ne semble pas fonctionner...