271 votes

soumettre un formulaire GET avec des paramètres de chaîne de requête et des paramètres cachés disparaissent

Considérez cette forme :

<form ... action="http:/www.blabla.com?a=1&b=2" method="GET">
<input type="hidden" name="c" value="3" /> 
</form>

Lorsque je soumets ce formulaire (un formulaire GET), les paramètres a et b disparaissent. Y a-t-il une raison à cela ? Existe-t-il un moyen d'éviter ce comportement ?

Merci, Tal.

308voto

Arjan Points 7154

N'est-ce pas à cela que servent les paramètres cachés pour commencer... ?

<form action="http://www.example.com" method="GET">
  <input type="hidden" name="a" value="1" /> 
  <input type="hidden" name="b" value="2" /> 
  <input type="hidden" name="c" value="3" /> 
  <input type="submit" /> 
</form>

Je ne compterais pas sur un navigateur qui conserverait une chaîne de requête existante dans l'URL de l'action.

Comme les spécifications ( RFC1866 , page 46 ; HTML 4.x section 17.13.3) déclarent :

Si la méthode est "get" et que l'action est un URI HTTP, l'agent utilisateur prend la valeur de l'action, y ajoute un `?', puis ajoute l'ensemble des données du formulaire, codées à l'aide du type de contenu "application/x-www-form-urlencoded".

On pourrait peut-être coder en pourcentage l'URL d'action pour intégrer le point d'interrogation et les paramètres, puis croiser les doigts en espérant que tous les navigateurs laisseront cette URL telle quelle (et valideront que le serveur la comprend aussi). Mais je ne me fierais jamais à cela.

A propos : ce n'est pas différent pour les champs de formulaire non cachés. Pour les POST, l'URL de l'action peut contenir une chaîne de requête.

83voto

xyphoid Points 561

En HTML5, il s'agit d'un comportement spécifique.

Ver http://www.w3.org/TR/2011/WD-html5-20110525/association-of-controls-and-forms.html#form-submission-algorithm

Voir "4.10.22.3 Algorithme de soumission de formulaire", étape 17. Dans le cas d'un formulaire GET vers un URI http/s avec une chaîne de requête :

Soit la destination une nouvelle URL qui est égale à l'action sauf que son composant est remplacé par query (en ajoutant un caractère U+003F QUESTION MARK ( ?) si nécessaire). MARK ( ?) si nécessaire).

Ainsi, votre navigateur mettra à la poubelle la partie " ?..." existante de votre URI et la remplacera par une nouvelle partie basée sur votre formulaire.

Dans HTTP 4.0.1, la spécification produit des URI invalides - la plupart des navigateurs ne l'ont cependant pas fait

Ver http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3 Dans l'étape 4, un ? sera ajouté à l'URI, même s'il en contient déjà un.

14voto

Efx Points 111

Ce que vous pouvez faire est d'utiliser un simple foreach sur la table contenant les informations GET. Par exemple en php :

foreach ($_GET as $key => $value) {
    echo("<input type='hidden' name='$key' value='$value'/>");
}

5voto

Bernhard Hofmann Points 4741

Vous devez inclure les deux éléments (a et b) comme éléments d'entrée cachés ainsi que C.

0voto

KillerRabbit Points 31

J'avais un problème très similaire où pour l'action du formulaire, j'avais quelque chose comme :

<form action="http://www.example.com/?q=content/something" method="GET">
   <input type="submit" value="Go away..." />&nbsp;
</form>

Le bouton permettait à l'utilisateur d'accéder au site, mais les informations relatives à la requête disparaissaient et l'utilisateur atterrissait sur la page d'accueil plutôt que sur la page de contenu souhaitée. Dans mon cas, la solution consistait à trouver comment coder l'URL sans la requête pour que l'utilisateur arrive à la page souhaitée. Dans ce cas, ma cible était un site Drupal, donc il s'est avéré que /content/something a également fonctionné. J'aurais également pu utiliser un numéro de nœud (c'est-à-dire /node/123 ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X