2017-10-17 11 views
0

Je génère dynamiquement des FORMS et chaque formulaire a un ID en tant que variable GET. Alors disons qu'il ya deux formes:PHP POSTing/envoi d'informations incorrectes via des formulaires

<form action='website.com/controller?id=1'> 
    <input type="submit" name="submitting"> 
</form> 

<form action='website.com/controller?id=2'> 
    <input type="submit" name="submitting"> 
</form> 

Maintenant, pour des raisons étranges, je vois une requête POST, dans ma console, comme:

http://website.com/controller?id=2 

Pour les deux formes. En soumettant à la fois le formulaire, je vois la même demande POST. PS: Je modifie l'un des modules Prestashop.

+0

changez chaque forme 'nom' en une valeur unique et testez-la puis –

+0

@Sean je ne peux pas faire cela. Comme je l'ai dit, ces formes sont générées dynamiquement. – chandlerbing

+2

Le code que vous avez fourni, de manière isolée, n'aura pas le comportement que vous décrivez. Je ne vois pas d'autre moyen d'obtenir l'effet que vous décrivez sans JavaScript. Vous devez fournir un ** complet ** [mcve]. – Quentin

Répondre

0

Si vous ajoutez dynamiquement des formulaires après chargement de la page, et gestionnaires d'événements pour les soumettre, vous devez utiliser la délégation de l'événement.

Les gestionnaires d'événements doivent être attachés aux éléments qui existent lors du chargement de la page. Vous ne pouvez pas joindre un gestionnaire à un élément que vous ajoutez dynamiquement plus tard, après le chargement de la page.

Le moyen de contourner ce problème est d'utiliser event delegation. Par exemple:

$('form').on('submit', function() { 
    // This will handle any form which exists at page load. Any form 
    // dynamically added later will not be handled. 
} 

$('body').on('submit', '#someFormID', function(e) { 
    // This is attached to the parent body element, which of course exists 
    // on load, and will handle submission of anything in the body, even 
    // those which did not exist at page load. You can then filter to 
    // match only elements matching the next parameter - eg in this case 
    // handle only something with id 'someFormID'. 
} 

$('body').on('submit', function(e) { 
    // You can also dynamically work out which form has been submitted 
    var $button = $(e.target), 
     $form = $button.closest('form'), 
     action = $form.attr('action'); 
} 
+0

Si les gestionnaires d'événements n'étaient pas associés aux formulaires, ils se soumettraient à l'URL vers laquelle ils pointaient. Comme ils ne le font pas, le JavaScript doit être lié aux formulaires. – Quentin

+0

@Quentin Eventuellement, mais pas si l'URL est récupérée via jQuery, par exemple '$ (this) .attr ('action')', où '$ (this)' fait référence de manière inattendue à la 'forme' erronée. Nous avons vraiment besoin de voir le Javascript existant. –

+0

Il y a * beaucoup * de façons dont JavaScript pourrait être écrit qui résoudrait la mauvaise URL utilisée. La question a besoin d'un [mcve] avant de pouvoir répondre sans spéculation sauvage. – Quentin

0

Cela devrait fonctionner:

<form action='website.com/controller' method='get'> 
<Input type='hidden' name='id' value='1'> 
<input type="submit" name="submitting"> </form> 
<form action='website.com/controller' method='get'> 
<Input type='hidden' name='id' value='2'> 
<input type="submit" name="submitting"> </form> 
+0

Pourquoi cela devrait-il fonctionner? Le problème signalé dans la question était que ni l'action ni la méthode n'étaient respectées. Comment cela règle-t-il cela? – Quentin

-1

Lorsque nous exécutons le code que vous obtiendrez deux bouton d'envoi, le premier est pour la première et la deuxième forme est la deuxième forme. pour chaque formulaire il y a une action respective spécifiée dans le tag de formulaire car la méthode n'est pas définie dans la balise de formulaire par défaut cela considérera cela comme une requête GET et vous pouvez accéder aux valeurs de soumission en utilisant $ _REQUEST ou $ _GET. Si vous avez besoin d'un moyen sécurisé, vous pouvez essayer avec POST et accéder à des valeurs de dollars par $ _POST.

Ex: si nous exécutons le formulaire ci-dessus dans le dossier de test php et vous soumettons allez obtenir comme celui-ci comme http://localhost/test/website.com/controller?submitting=Submit

Si vous créez la même chose en html et soumettez pour le chemin du dossier « website.com/ controller? submititting = Soumettre "ceci sera ajouté.

Pour empêcher la soumission automatique, vous pouvez ajouter un jeton caché dans le formulaire.

+0

Cela semble être des faits aléatoires sur des formes qui * n'expliquent pas le comportement décrit dans la question ou ne résolvent pas le problème décrit *. – Quentin

+0

Vous avez raison, j'ai négligé de lire la question et de postuler correctement son problème, comme mentionné avant de faire des suppositions basées sur le contexte incomplet et mon échec à bien comprendre ceci: "Maintenant, pour des raisons étranges, je vois la requête POST, dans mon console, comme: http://website.com/controller?id=2 "ce qui indique clairement qu'il ne soumet pas directement les formulaires via HTTP, s'il était son problème ne pouvait pas être ce qu'il a décrit. J'ai supprimé toute ma réponse. –

0

Je vous remercie tous d'avoir pris le temps.

Etape finale: je me suis dit que je ne peux pas utiliser Ajax, parce que chaque fois que je POST, il obtient le id de dernière génération form Donc, s'il y a n nombre de formes, POST pour chaque bouton de soumission ressemblera:

http://website.com/controller?id=n 

Si c'était seulement environ 1 forme, cela n'aurait pas été un problème. Mais puisque les occurrences form sont fiables, AJAX échoue.

BTW, voici le code Ajax, je l'ai utilisé:

jQuery('form[name=someclass]).submit(function(e){ 
$.ajax({ 
     url: $('form[name=st_blog_comment_form]').attr('action'), 
     type: 'POST', 
     headers: { "cache-control": "no-cache" }, 
     dataType: 'json', 
     data: $('form[name=someclass]').serialize(), 
     cache: false, 
     success: function(json){} 
)}; 

Ou peut-être, je l'ai pas utilisé ajax correctement.

+0

Si vous voulez le faire fonctionner, s'il vous plaît jeter un oeil à ma réponse. Le code jQuery que vous avez montré souffre exactement du problème que je décris. Votre sélecteur ne gérera que les formulaires qui existent sur le chargement de la page - pas n'importe quoi ajouté dynamiquement plus tard. De plus, ils afficheront tous la même URL unique, car le sélecteur que vous utilisez pour trouver l'URL ne correspondra qu'à votre formulaire 'st_blog_comment_form', pas à celui que vous envoyez actuellement. Essayez mon code, et laissez-moi savoir si vous avez des questions - vous y êtes presque! :-) –

+0

Lors du chargement de la page, tous les formulaires (qui sont générés dynamiquement) existent, leur «forme» étant facilement inspectable dans les outils de développement. – chandlerbing