Traitement des variables POST par Internet Explorer

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Traitement des variables POST par Internet Explorer

par abelthorne » 10 sept. 2008, 17:34

Je ne suis pas sûr du tout. Je vais tester mais d'après ce que j'ai fait jusqu'à présent, j'ai peur d'être confronté à deux problèmes :
- la succession des champs hidden va supprimer la valeur précédente, non ? Autrement dit, dans ton exemple j'aurai toujours la valeur "3", quel que soit le bouton pressé ;
- À priori, l'utilisation de l'élément <button> pose problème à IE, même si mon problème d'origine est résolu (cf le lien que j'ai posté plus haut) ;

Mais bon, je vais tester tout de suite.

EDIT : c'est bien ce qu'il me semblait : je récupère automatiquement la valeur du dernier champ hidden...
EDIT 2 : et puis sous IE, je me retrouve effectivement avec le problème évoqué sur l'autre forum, à savoir que la valeur de $_POST['bt'] est automatiquement le contenu de la dernière balise <button> ("Supprimer la fiche de la machine").

Après quelques tests, la seule solution viable dans mon cas me semble être quelque chose comme ça :

Code : Tout sélectionner

Nouvelle machine (n°36) <input type="submit" name="insert:36" value="Ajouter une fiche machine"/> Machine n°1 <input type="submit" name="edit:1" value="Modifier les caractéristiques de la machine"/> <input type="submit" name="delete:1" value="Supprimer la fiche de la machine"/> Machine n°3 <input type="submit" name="edit:3" value="Modifier les caractéristiques de la machine"/> <input type="submit" name="delete:3" value="Supprimer la fiche de la machine"/>
Et puis d'analyser les clés de chaque élément de $_POST pour trier les actions possibles des autres champs.
Si quelqu'un a une solution plus respectueuse de la syntaxe HTML d'origine, je suis preneur.

par _activmik » 10 sept. 2008, 17:25

Dans ce cas là, désolé, mais si tu ne veux pas de JS, le champ hidden est ton ami :)

Je partirais sur :

Code : Tout sélectionner

<form action="machines.php" method="POST"> Nouvelle machine <input type="hidden" value=36 name="num_mach" /> <button type="submit" value="insert" name="bt">Ajouter une fiche machine</button> Machine n°1 <input type=hidden value="1" name="num_mach"/> <button type="submit" value="edit" name="bt">Modifier les caractéristiques de la machine</button> <button type="submit" value="delete" name="bt">Supprimer la fiche de la machine</button> Machine n°3 <input type=hidden value="3" name="num_mach"/> <button type="submit" value="edit" name="bt">Modifier les caractéristiques de la machine</button> <button type="submit" value="delete" name="bt">Supprimer la fiche de la machine</button>
Ensuite tu pourras récupérer le numéro de ta machine grâce à $_POST['num_machine'] et l'action à réaliser grâce à $_POST['bt'].

par abelthorne » 10 sept. 2008, 17:14

Je pense plutot à une erreur d'analyse du problème.
En gros, tu veux pouvoir envoyer une seule donnée par rapport à un choix multiple représenté par des boutons ?
En gros, oui. Mais pas forcément une seule donnée (en l'occurrence, deux : un identifiant et une action à effectuer).

Pour le moment, l'hypothèse la plus crédible que j'ai est d'utiliser des champs input et d'amalgamer les données que j'ai dans le champ name. Soit en utilisant un tableau du style name="action['edit'][3]" (mais là, ça me pose un autre problème), soit en utilisant une structure particulière pour le nom et en l'analysant (par exemple name="edit:3" puis je récupère mes données à coup d'explode sur la clé de $_POST) mais je ne trouve pas ça très propre.

par akrogames » 10 sept. 2008, 17:08

Oui c'est sur si tu peux t'en passer je suis d'accord avec toi.

Mais bon quand cela facilite la vie autant l'utilisé. Bon je m'en vais de ton post c'est pas trop le sujet. Bonne chance

par _activmik » 10 sept. 2008, 17:05

Renié JavaScript non, mais on peut souvent largement s'en passer.
Il faut juste être en adéquation avec ce que tu cherches à faire, les outils qui te permette de le faire et ce que tu sais faire, en essayant au mieux de tout regrouper... Enfin c'est mon avis 8-)

par akrogames » 10 sept. 2008, 17:00

A l'heure du Web 2.0 et d'AJAX et de l'enrichissement du W3C... C'est un comble de vouloir faire des applications web sans JavaScript.

Il faut savoir évoluer. Je dit pas cela pour le créateur du sujet mais c'est une remarque générale.

Il y a encore des anciens qui renie javascript alors que celui-ci en est à son moteur V8 dans google chrome...Par exemple...

Enfin bon voilà, je suis fâché contre les gens qui renie javascript

par _activmik » 10 sept. 2008, 16:57

Je pense plutot à une erreur d'analyse du problème.

En gros, tu veux pouvoir envoyer une seule donnée par rapport à un choix multiple représenté par des boutons ?

par Nagol » 10 sept. 2008, 16:38

alors il me semble que je ne connais pas la solution à ton problème, purement et simplement :)

par abelthorne » 10 sept. 2008, 16:35

il ne me semble pas très naturel de vouloir récupérer une quelconque valeur issue d'un bouton de toute manière.
Au contraire, il me semble que c'est justement la fonction de l'élément <button> de fonctionner de cette manière.
Un champ hidden
Ça ne va pas convenir pour mon cas, puisqu'il faudrait que j'aie plusieurs champs hidden avec le même nom et je récupérerais automatiquement la valeur du dernier plutôt que celui "associé" au bouton pressé.
une action javascript sur les boutons qui change la valeur de ce champ hidden avant submit, et aucun argument name sur les boutons, ça règlerait ton problème, ça serait plus élégant.
C'est exclu, le JavaScript doit être non intrusif (mon appli doit fonctionner sur un navigateur qui désactiverait JavaScript).

Je vais développer un peu mon problème. Concrètement, dans le cas présent, je dois gérer une liste de machines via une interface, chaque machine étant identifiée par un numéro (dans une base de données). J'ai donc une page avec un formulaire qui me permet de gérer les machines, ce qui me donne quelque chose dans ce goût-là :

Code : Tout sélectionner

<form action="machines.php" method="POST"> Nouvelle machine <button type="submit" name="insert" value="36">Ajouter une fiche machine</button> Machine n°1 <button type="submit" name="edit" value="1">Modifier les caractéristiques de la machine</button> <button type="submit" name="delete" value="1">Supprimer la fiche de la machine</button> Machine n°3 <button type="submit" name="edit" value="3">Modifier les caractéristiques de la machine</button> <button type="submit" name="delete" value="3">Supprimer la fiche de la machine</button> Machine n°17 <button type="submit" name="edit" value="17">Modifier les caractéristiques de la machine</button> <button type="submit" name="delete" value="17">Supprimer la fiche de la machine</button> </form>
Ainsi, si je clique sur le bouton de suppression de la machine 3, je récupère en $_POST le nom "delete" et la valeur "3" qui me permettent de savoir que je dois effacer celle-ci.

par _activmik » 10 sept. 2008, 16:26

Une petite question, cependant : quelle est la différence entre un type "button" et un type "submit" dans un <input> ?
Le tag <button> te donne un boutton classique, alors que le <input type=button> valide le formulaire dans lequel il est contenu.

par Nagol » 10 sept. 2008, 16:16

il ne me semble pas très naturel de vouloir récupérer une quelconque valeur issue d'un bouton de toute manière.

Si tu le permet je vais te dire comment j'aurais fait:

Un champ hidden, une action javascript sur les boutons qui change la valeur de ce champ hidden avant submit, et aucun argument name sur les boutons, ça règlerait ton problème, ça serait plus élégant.

par abelthorne » 10 sept. 2008, 15:49

as tu essayé avec

Code : Tout sélectionner

<form action="truc.php" method="POST"> <input type="button" name="boutton1" value="Envoyer" /> <input type="button" name="boutton1" value="Envoyer 2" /> <input type="button" name="boutton1" value="Envoyer 3" /> </form>
Justement, j'utilise des éléments <button> pour pouvoir avoir une valeur indépendante du texte du bouton. Pour reprendre mon exemple, ça ne m'intéresse pas de récupérer "Envoyer" en $_POST, il me faut la valeur "1", "2", etc. pour la simple raison que plusieurs boutons doivent avoir le même texte mais envoyer des valeurs différentes : ainsi, je peux avoir plusieurs boutons "Éditer" qui passeront des valeurs différentes et me donneront une ID à traiter.

Je vais essayer de voir si je peux modifier tout mon système sans trop de problèmes pour utiliser des <input> + <label> au lieu des <button> sans foutre en l'air toutes mes classes. (EDIT : ah ben non, suis-je bête : un input submit va afficher sa valeur comme texte de bouton, je ne vais pas pouvoir la planquer...)

Une petite question, cependant : quelle est la différence entre un type "button" et un type "submit" dans un <input> ?

par Nagol » 10 sept. 2008, 15:44

as tu essayé avec

Code : Tout sélectionner

<form action="truc.php" method="POST"> <input type="button" name="boutton1" value="Envoyer" /> <input type="button" name="boutton1" value="Envoyer 2" /> <input type="button" name="boutton1" value="Envoyer 3" /> </form>

Traitement des variables POST par Internet Explorer

par abelthorne » 10 sept. 2008, 15:16

Bonjour,
Je suis en train de réaliser un backoffice en PHP, dans lequel je manipule des formulaires avec plusieurs boutons. Par exemple

Code : Tout sélectionner

<form action="truc.php" method="POST"> <button type="submit" name="bouton1" value="1">Envoyer</button> <button type="submit" name="bouton2" value="2">Envoyer 2</button> <button type="submit" name="bouton3" value="3">Envoyer 3</button> </form>
Tout allait pour le mieux dans le meilleur des mondes jusqu'à ce que je teste mon interface sous IE6. Là où sous Firefox / Opera / Safari je me retrouve avec la valeur du bouton pressé dans les variables POST (si je presse le bouton 2, j'ai uniquement $_POST['bouton2'] de réglé), sous IE6 je me retrouve avec tous les boutons de réglés en POST !

Et comme je cherche à déterminer quel bouton a été pressé pour effectuer l'action adéquate, rien ne marche.

J'ai essayé d'utiliser des boutons sans le type "submit" mais le formulaire n'est pas validé (pas de POST) si je presse dessus.

Est-ce qu'il y a un moyen de contourner ce problème ou, dans une moindre mesure, une façon particulière de gérer les formulaires multi-boutons pour qu'ils fonctionnent avec tous les navigateurs ?

Note : sous IE7, ça ne marche pas beaucoup mieux : les variables POST sont bien réglées mais, pour une raison que je n'ai pas encore eu le temps de creuser, le code ne semble pas traité.

EDIT : manifestement, je ne suis pas le seul à avoir rencontré ce problème, qui vient apparemment du fait qu'Internet Explorer se contrefout des standards établis (comme d'habitude...).
Je vais voir comment je peux contourner ça avec des <input> à la place des <button>.