JeuWeb - Crée ton jeu par navigateur

Version complète : formulaire et double clique
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Pages : 1 2 3
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 Wink

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 Smile
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. Smile

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 Wink

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 Big Grin)

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 Wink
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...
La partie Javascript n'est là qu'en bonus, pour être plus agréable pour l'utilisateur en l'empêchant de se confronter à une erreur s'il clique plusieurs fois.

L'authenticity token est un grand classique (implémenté dans tous les frameworks sérieux), mais je ne vois pas ce qu'il a de plus propre/moins bidouille, c'est équivalent (avec un champ caché côté formulaire en plus).


Sephi-Chan
(12-08-2010, 10:30 AM)php_addict a écrit : [ -> ]merci je n'avais pas pensé au jeton, meme si je l'utilise pour les failles xss Wink
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...
Les attributs doivent être écrits en minuscules, c'est tellement 90' le camelCase ! Smile

Par ailleurs, l'événement onsubmit s'applique au formulaire (cf. W3Schools - HTML / XHTML Standard Event Attributes), donc tu auras plutôt un code de la forme :

Code :
<form action="..." method="..." onsubmit="document.getElementById('submit_button').disabled = true;">
  <input type="submit" id="submit_button" />
</form>


Sephi-Chan
(12-08-2010, 10:39 AM)Sephi-Chan a écrit : [ -> ]Les attributs doivent être écrits en minuscules, c'est tellement 90' le camelCase ! Smile


Par ailleurs, l'événement onsubmit s'applique au formulaire

je ne savais pas, il y a tant de mauvais code js sur la toile...

merci cela fonctionne (pour ce qui est du JS)

bonne fin de matinée
Pages : 1 2 3