Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1328 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [RESOLU] Eviter la double validation de formulaire "bouton précédent"?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] Eviter la double validation de formulaire "bouton précédent"?

n°765466
aspegic500​mg
Posté le 16-06-2004 à 11:20:08  profilanswer
 

Dans mes sites web, principalement dans les parties d'administration où des utilisateurs peuvent mettre à jour (ajouter, maj, suppression) des données du site, j'ai le problème récurent de l'utilisateur qui valide un formulaire d'ajout d'une "fiche" (par exemple) puis qui ensuite fait "précédent" dans son navigateur, lequel lui demande si il veut renvoyer les données passées en POST, si il annule il ne peut pas faire précédent, et si il valide ca ajoute une deuzième fois la fiche, ce qui génère un doublon (source de problème) :na:  
 
Pour le régler je pense à générer un identifiant en champ caché dans les formulaire, puis à la validation des formulaires vérifier si l'identifiant à déjà été utilisé, auquel cas je ne valide pas une deuzième fois le formulaire, est-ce que cela vous semble une idée acceptable? :??:  
Sinon d'autres idées? :)


Message édité par aspegic500mg le 30-06-2004 à 10:46:51
mood
Publicité
Posté le 16-06-2004 à 11:20:08  profilanswer
 

n°765497
Berceker U​nited
PSN : berceker_united
Posté le 16-06-2004 à 11:34:44  profilanswer
 

Dans le domaine du web c'est un probleme récurant de la double validation du formulaire.
Il y a le probleme du bouton de validation qui est cliqué deux fois et fais donc deux fois la validation pour cela il faut faire un javascript qui desactive ton bouton au moment ou il est cliqué ou bien le rendre invisible.
Pour ton cas cela peut etre une bonne chose mais personnellement tu devrais fais un fichier intermediaire qui traite ton formulaire puis fais une redirection sur le fichier.
formulaire->traitement->page.
c'est comme fait FHR :)

n°765506
aspegic500​mg
Posté le 16-06-2004 à 11:37:51  profilanswer
 

berceker united a écrit :

Dans le domaine du web c'est un probleme récurant de la double validation du formulaire.
Il y a le probleme du bouton de validation qui est cliqué deux fois et fais donc deux fois la validation pour cela il faut faire un javascript qui desactive ton bouton au moment ou il est cliqué ou bien le rendre invisible.
Pour ton cas cela peut etre une bonne chose mais personnellement tu devrais fais un fichier intermediaire qui traite ton formulaire puis fais une redirection sur le fichier.
formulaire->traitement->page.
c'est comme fait FHR :)


 
oui mais une fois l'utilisateur sur la page, si il fait précédent il tombe sur la page de validation et renvoie les précédentes données en POST donc ca fait le meme effet :sweat:

n°765541
Berceker U​nited
PSN : berceker_united
Posté le 16-06-2004 à 11:53:33  profilanswer
 

Aspegic500mg a écrit :

oui mais une fois l'utilisateur sur la page, si il fait précédent il tombe sur la page de validation et renvoie les précédentes données en POST donc ca fait le meme effet :sweat:


je tes dis que ce que tu faisait étais une bonne idée :) . Tu peux faire aussi une détection de doublons en base concernant l'utilisateur.

n°765594
Mara's dad
Yes I can !
Posté le 16-06-2004 à 12:17:17  profilanswer
 

Le coup du champs caché est une simplification de l'utilisation des sessions.
 
Avec une session, quand tu envoie un formulaire à l'utilisateur, tu peux enregistrer en session à quelle étape de ton workflow il en est.
Quand tu recois un formulaire, tu peux ainsi vérifier que l'utilisateur est bien à la bonne étape. Si ce n'est pas le cas, tu peux soit afficher un message d'erreur, soit le remettre dans le droit chemin.
Pour ne pas avoir à faire ce traitement dans tout tes formulaires, il est bon de n'avoir qu'un seul point d'entrée qui valide ce genre de choses.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°765600
aspegic500​mg
Posté le 16-06-2004 à 12:24:16  profilanswer
 

Mara's dad a écrit :

Le coup du champs caché est une simplification de l'utilisation des sessions.
 
Avec une session, quand tu envoie un formulaire à l'utilisateur, tu peux enregistrer en session à quelle étape de ton workflow il en est.
Quand tu recois un formulaire, tu peux ainsi vérifier que l'utilisateur est bien à la bonne étape. Si ce n'est pas le cas, tu peux soit afficher un message d'erreur, soit le remettre dans le droit chemin.
Pour ne pas avoir à faire ce traitement dans tout tes formulaires, il est bon de n'avoir qu'un seul point d'entrée qui valide ce genre de choses.


 
Je pensais à cette solution, effectivement ca nécéssite des modifications à pas mal d'endroits :pt1cable:  :jap:

n°765635
Mara's dad
Yes I can !
Posté le 16-06-2004 à 12:47:10  profilanswer
 

C'est pour ça qu'il faut y penser au début du projet :D
 
Pour ton projet en cours, ta solution fonctionnera, mais pense aux sessions pour la prochaines fois...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°765666
Berceker U​nited
PSN : berceker_united
Posté le 16-06-2004 à 13:25:51  profilanswer
 

je crois qu'il y a un truc en javascript pour éviter le retour et lorsque tu effectue un retour il te faire une redirection ou autre c'est toi qui choisi.  
Mais le coup de la variable de session c'est bon aussi.

n°765676
boulax
Inserer phrase hype en anglais
Posté le 16-06-2004 à 13:35:13  profilanswer
 

Si dans le fichier intermediaire qui traite le formulaire tu rediriges sur la page d'apres avec window.location.replace(url), le fichier intermediaire n'apparait pas dans l'historique du navigateur, donc pas de probleme de précédent.
 
Euh c'est soit replace soit href, enfin y'en a une des deux qui fait ca mais je suis plus sûr la ...


---------------
Posté depuis des chiottes, sales. Me gusta.
n°765683
aspegic500​mg
Posté le 16-06-2004 à 13:43:40  profilanswer
 

Mara's dad a écrit :

C'est pour ça qu'il faut y penser au début du projet :D
 
Pour ton projet en cours, ta solution fonctionnera, mais pense aux sessions pour la prochaines fois...


 
Justement j'ai un projet que je viens de débuter et que je fais hyper propre (j'ai la chance d'avoir le temps pour ca), donc je pense faire ca :p  
 
en gros ca fonctionne comme ca:
j'ai une variable de session "flag" (par exemple)
à chaque fois que l'utilisateur arrive sur une page où un formulaire se présente à lui le flag passe à "formulaire", et à chaque fois qu'il vient de traiter un formulaire la variable passe à "traitement", un formulaire n'est traité que si quand on le demande le flag est à "formulaire" ?  :)

mood
Publicité
Posté le 16-06-2004 à 13:43:40  profilanswer
 

n°765728
Mara's dad
Yes I can !
Posté le 16-06-2004 à 14:05:47  profilanswer
 

Par exemple oui.
 
On peut faire beaucoup d'autres choses :
 
1- Envoie du formulaire :
 
$_SESSION['form_name'] = "saisie-client";
$_SESSION['saisie-client']['nom']['type'] = ALPHA;
$_SESSION['saisie-client']['nom']['mandatory'] = true;
$_SESSION['saisie-client']['nom']['min-length'] = 5;
$_SESSION['saisie-client']['nom']['max-length'] = 25;
 
$_SESSION['saisie-client']['tel']['type'] = TEL;
$_SESSION['saisie-client']['tel']['mandatory'] = false;
 
$_SESSION['saisie-client']['code_metier']['type'] = LIST;
$_SESSION['saisie-client']['code_metier']['mandatory'] = true;
$_SESSION['saisie-client']['code_metier']['values'] = $tableux_des_codes_metier;
 
...
 
2- Réception du formulaire :
 
Vérifier que $_SESSION['form_name'] existe et récupérer sa valeur -> $form_name.
Si n'existe pas, erreur -> étape précedente.
 
Supprimer le formulaire de la session : unset( $_SESSION['form_name'] );
 
Récupérer le tableau des champs du formulaire : $formFields = $_SESSION['saisie-client'];
 
Vérifier les champs reçus par rapport à ce qu'on attend.
Le champs est-il obligatoire.
Suivant sont type, les données reçues sont-elles correctes...
 
Tu vois le principe.
 
Tout un tas de vérificactions peuvent être automatisées.
 
J'ai utilisé des tableaux pour faire simple, mais une bonne idée serait d'utiliser des objets. Avec des objets, il est plus simple d'appeler la fonction (méthode) de vérification qui va bien :D
 
A toi de jouer !


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°769270
Rainbow_Ef​reet
Posté le 18-06-2004 à 16:12:44  profilanswer
 

Fais une page de traitement qui n'affiche rien et qui redirigera grace à un header location sur la page voulu.
Comme ça pas de doublons possibles

n°780620
aspegic500​mg
Posté le 28-06-2004 à 15:34:15  profilanswer
 

Je viens (enfin) de tester en générant un champ caché avec un idenfitifant aléatoire, et quand on fait précédent aprés avoir validé un formulaire ca nous ramène au formulaire mais un nouvel identifiant aléatoire à été généré donc pas moyen de vérifier.
 
Pour les session le problème va être que si un utilisateur fait plein de fois précédent ca risque de poser des problèmes avec le flag.
 
Je crois qu'il ne me reste qu'a fait le système de la page de traitement qui redirige ensuite ailleurs, mais ca va me faire faire pas mal de modif dans mes script :na:
Avec ce système (ce qu'il y'a apparement sur hfr) quand on fait précédent ca redirige sur le formulaire et non sur la page de traitement qui nous amené ici via un header location ?

n°780776
harrysauce
Miaaaooou!
Posté le 28-06-2004 à 17:26:35  profilanswer
 

aspegic500mg a écrit :

oui mais une fois l'utilisateur sur la page, si il fait précédent il tombe sur la page de validation et renvoie les précédentes données en POST donc ca fait le meme effet :sweat:

:non:  
T'as la page (on va l'appeller page1) avec le formulaire
Une page intermédiaire (page2) qui va traiter ce formulaire, ajouter les infos à la bdd, et rediriger vers une troisième page (page3).
 
Une fois sur la page3, si l'utilisateur clique sur le bouton précédent, il se retrouve sur la page 1, pas la page2! (ben oui, la redirection a été faite par le serveur, donc totalement transparente pour le navigateur)
 
Après tu gères ton mécanisme pour que les infos de cette page soit modifiées et non ajoutées (genre avec des sessions, tu créés un tableau contenant autant d'élément que de page, chaque élément permettant de savoir si telle ou telle page a déjà été ajoutée pour cet utilisateur).....


Message édité par harrysauce le 28-06-2004 à 17:27:55
n°780868
aspegic500​mg
Posté le 28-06-2004 à 18:43:57  profilanswer
 

harrysauce a écrit :

:non:  
T'as la page (on va l'appeller page1) avec le formulaire
Une page intermédiaire (page2) qui va traiter ce formulaire, ajouter les infos à la bdd, et rediriger vers une troisième page (page3).
 
Une fois sur la page3, si l'utilisateur clique sur le bouton précédent, il se retrouve sur la page 1, pas la page2! (ben oui, la redirection a été faite par le serveur, donc totalement transparente pour le navigateur)
 
Après tu gères ton mécanisme pour que les infos de cette page soit modifiées et non ajoutées (genre avec des sessions, tu créés un tableau contenant autant d'élément que de page, chaque élément permettant de savoir si telle ou telle page a déjà été ajoutée pour cet utilisateur).....


 
Voilà c'est ce que je voulais savoir :jap:  
 
Je n'avais pas pensé au fait que le précédent est fait par rapport au navigateur et que le header est fait par le serveur, merci :)

n°782140
aspegic500​mg
Posté le 30-06-2004 à 10:46:08  profilanswer
 

Problème résolu, mon formulaire appelle une page de traitement que voici:
 

Code :
  1. <?php
  2. include('include.php');
  3. if(verifauthentification());
  4. {
  5. if(autorisationAcces("Signaler une panne informatique" ))
  6. {
  7.  if($_GET['phase'] == 3 && $_POST['idmachine'] != '' && $_POST['description'] != '')
  8.  {
  9.   $requete = 'INSERT INTO problemeinfo (idmachine,idgens,date,statut,description) values("'.$_POST['idmachine'].'","'.$_SESSION['login'].'","'.mktime().'","nouveau","'.$_POST['description'].'" )';
  10.   $resultat = ExecRequete ($requete, $connexion);
  11.   header("Location: ./signalerpanneinfo.php?phase=4&erreur=0" );
  12.  }
  13.  else
  14.  {
  15.   header("Location: ./signalerpanneinfo.php?phase=4&erreur=1" );
  16.  }
  17. }
  18. }
  19. ?>


 
Cette page de traitement renvoie sur le fichier du formulaire mais avec une autre phase (phase=4 va indiquer que c'est la fin de l'opération, enfin j'me comprend :pt1cable: )
 
et ca marche im-pec, merci à tous :jap:
 
 
edit: raaaaaa c'est trop dla balle j'ai pu de doublon ni de messages chiants, je modifie tous mes scripts :love:


Message édité par aspegic500mg le 30-06-2004 à 11:09:44
n°1320891
matlau
Posté le 08-03-2006 à 13:45:33  profilanswer
 

Salut,
 
gros up  :pt1cable:  
 
Comme avec IE tu peux ouvrir une nouvelle fenêtre sur la même page (CTRL-N), comment gères tu la double validation ?
 
Exemple :
Dans la première fenêtre, le membre est prêt à valider son commentaire.  
Il faut CTRL-N
Il valide la premiere fenêtre
Puis il valide la deuxième fenêtre.  
Il y a doublon alors, non ?


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [RESOLU] Eviter la double validation de formulaire "bouton précédent"?

 

Sujets relatifs
[resolu] Afficher le contenu de la base de donnée dans l'ordre[resolu] Emoticone et textarea
myform.submit() plante quand le formulaire est trop rempli ![RESOLU]creer une fonction
Problème Connexion BDD (ASP) [Résolu][Résolu] Pb affection variable ...
double pb vb excelProblème liaison Javascript/PHP [Résolu]
informations pour la réalisation d'un formulaire[Résolu] Menu déroulant inversé en CSS
Plus de sujets relatifs à : [RESOLU] Eviter la double validation de formulaire "bouton précédent"?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR