Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

probleme de document.location en sens unique - PRECEDENT

3 réponses
Avatar
dominique
Bonjour,

Je vous fais part du probleme suivant :

1. L'utilisateur saisit un formulaire formu.html et le valide.
2. Le formulaire pointe sur un fichier traitement.php, qui met à jour
une base, puis fait un document.location sur ma page de formulaire, de
facon à ce que l'utilisateur puisse voir les données mise à jour.
3. Le probleme, c'est que si l'utilisateur clique sur le bouton
PRECEDENT du navigateur, il arrive à nouveau sur la page traitement.php
qui le renvoie à nouveau sur la page du formulaire.

Comment faire pour éviter ceci. Merci

3 réponses

Avatar
Eric

Bonjour,

Je vous fais part du probleme suivant :

1. L'utilisateur saisit un formulaire formu.html et le valide.
2. Le formulaire pointe sur un fichier traitement.php, qui met à jour
une base, puis fait un document.location sur ma page de formulaire, de
facon à ce que l'utilisateur puisse voir les données mise à jour.
3. Le probleme, c'est que si l'utilisateur clique sur le bouton
PRECEDENT du navigateur, il arrive à nouveau sur la page traitement.php
qui le renvoie à nouveau sur la page du formulaire.

Comment faire pour éviter ceci. Merci


Il y a pas mal d'écoles qui s'affrontent (aucune n'uitlise le
javascript d'ailleurs).



La mienne, c'est le header HTTP, tu mets dans ton code PHP :

header('location:http://www.monsite.com/merci.html');
-ou-
header('location:merci.html');
(la seconde ligne n'est pas conforme aux normes, mais bien respectée
par les navigteurs et plus pratique)

Avec cette méthode, pas de problème avec le bouton précédent,
suivant, actualiser, mais problème en cas de double clic sur le bouton
envoi.



Pour gérer le doubleclic, tu peux envoyer dans le formulaire un
numéro unique (une clé primaire ?), valable qu'une fois. La première
fois, la personne clique sur le bouton envoyer et donne son numéro
unique, l'insertion est faite dans la BDD. La personne s'impatiente,
clique sur le même bouton envoyer, retourne le même numéro à usage
unique, le numéro est expiré.



Pour moi, la protection idéale cosiste donc en numéro unique + header
http.

Avatar
O.L.

Bonjour,

Je vous fais part du probleme suivant :

1. L'utilisateur saisit un formulaire formu.html et le valide.
2. Le formulaire pointe sur un fichier traitement.php, qui met à jour
une base, puis fait un document.location sur ma page de formulaire, de
facon à ce que l'utilisateur puisse voir les données mise à jour.
3. Le probleme, c'est que si l'utilisateur clique sur le bouton
PRECEDENT du navigateur, il arrive à nouveau sur la page traitement.php
qui le renvoie à nouveau sur la page du formulaire.

Comment faire pour éviter ceci. Merci


Il y a pas mal d'écoles qui s'affrontent (aucune n'uitlise le
javascript d'ailleurs).



La mienne, c'est le header HTTP, tu mets dans ton code PHP :

header('location:http://www.monsite.com/merci.html');
-ou-
header('location:merci.html');
(la seconde ligne n'est pas conforme aux normes, mais bien respectée
par les navigteurs et plus pratique)

Avec cette méthode, pas de problème avec le bouton précédent,
suivant, actualiser, mais problème en cas de double clic sur le bouton
envoi.



Pour gérer le doubleclic, tu peux envoyer dans le formulaire un
numéro unique (une clé primaire ?), valable qu'une fois. La première
fois, la personne clique sur le bouton envoyer et donne son numéro
unique, l'insertion est faite dans la BDD. La personne s'impatiente,
clique sur le même bouton envoyer, retourne le même numéro à usage
unique, le numéro est expiré.



Pour moi, la protection idéale cosiste donc en numéro unique + header
http.


Et aussi tant qu'à faire je mettrais bien une protection pour éviter le
double clic sur le bouton, même si c'est en JavaScript donc
contournable et carrément inutile si l'utilisateur a désactivé JS :

<form action="traitement.php"
onsubmit="document.getElementById('btnEnvoi').disabled=true;">
... tes champs ...
<input type=submit value="Envoi" id=btnEnvoi>
</form>

--
Olivier Ligny
Créateur web free-lance / www.cyber-tamtam.net


Avatar
Olivier Miakinen

1. L'utilisateur saisit un formulaire formu.html et le valide.


Bien.

2. Le formulaire pointe sur un fichier traitement.php, qui met à jour
une base, puis fait un document.location sur ma page de formulaire, de
facon à ce que l'utilisateur puisse voir les données mise à jour.


Je n'ai pas tout compris ici (document.location)... Si c'est une
redirection du style "Location: http://example.com/truc", il vaut mieux
l'éviter puisque ton fichier .php devrait pouvoir afficher le résultat
sans aller-retour inutile. C'est encore pire avec "Location: truc".

3. Le probleme, c'est que si l'utilisateur clique sur le bouton
PRECEDENT du navigateur, il arrive à nouveau sur la page traitement.php
qui le renvoie à nouveau sur la page du formulaire.


La question à se poser est « en quoi est-ce un problème ? » et la
réponse la plus fréquente semble être « parce que j'utilise un champ
en autoincrément comme clé de ma base ». Arrivé ici, il est temps de
repenser l'architecture de sa base pour utiliser une vraie clé unique.
Ainsi, le visiteur peut revenir en arrière autant qu'il le voudra, il
peut même envoyer 800 exemplaires de formulaire, tu seras protégé du
fait que la clé unique interdira de faire 800 créations identiques.

Comment faire pour éviter ceci. Merci


1) ne pas utiliser de clé en auto-incrément
2) ne pas faire de header("Location: http://example.com/truc");
3) ne surtout pas faire de header("Location: truc");
4) lire John Gallet sur fr.comp.lang.php :
<http://groups.google.fr/groups/search?q=%22machine+%C3%A0+laver%22+author%3Ajohn+author%3Agallet>