2017-10-17 181 views
0

我动态生成FORMS,每个表单都有一个ID作为GET变量。所以我们可以说有两种形式:PHP通过表单发布/提交错误信息

<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> 

现在,由于一些奇怪的原因,我看到POST请求,在我的控制台,如:

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

对于这两种形式。在提交这两个表单时,我会看到相同的POST请求。 PS:我正在修改一个Prestashop模组。

+0

将每个表格'名称'更改为一个唯一的值,然后测试它 –

+0

@我不能这样做。就像我说的,这些表格是动态生成的。 – chandlerbing

+2

您提供的代码单独存在,不会有您描述的行为。如果不涉及JavaScript,我想不出有什么办法可以得到你描述的效果。你需要提供一个**完整的** [mcve]。 – Quentin

回答

0

如果你是动态添加页面加载后的形式,并且使用事件处理程序来提交他们,你需要使用事件代表团。

事件处理程序必须附加到页面加载时存在的元素。在页面加载后,您无法将处理程序附加到稍后动态添加的元素。

解决此问题的方法是使用event delegation。例如:

$('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

如果事件处理程序没有与表单关联,那么它们将提交到它们的操作指向的URL。由于他们没有,JavaScript必须绑定到表单。 – Quentin

+0

@Quentin可能,但不是如果通过jQuery获取URL,例如'$(this).attr('action')',其中'$(this)'意外地指错误的'form'。我们真的需要看到现有的Javascript。 –

+0

有很多方法可以编写JavaScript,以解决使用错误的URL的问题。这个问题需要一个[mcve],然后才可以进行,而且不需要疯狂的猜测。 – Quentin

0

这应该工作:

<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

它为什么要工作?问题中报告的问题是行动和方法都没有得到尊重。这是如何解决这个问题的? – Quentin

-1

当我们执行您将获得两个提交按钮的代码,第一个是第一形态和第二个是第二种形式。对于每个表单,在表单标签中指定了相应的操作,因为默认情况下方法未在表单标签中定义,因此它会将此视为请求GET,您可以使用$ _REQUEST或$ _GET访问提交值。如果你需要一个安全的方式,你可以尝试使用POST并通过$ _POST访问这些值。

例如:如果我们执行的PHP测试文件夹上面的表格并提交,你会越来越喜欢这个像 http://localhost/test/website.com/controller?submitting=Submit

如果您在HTML创建同样的事情,提交的文件夹路径“website.com/控制器?提交=提交“这将被追加。

为了防止自动提交,您可以在表单中添加隐藏的令牌。

+0

这似乎是一些有关表格的随机事实,它不能解释问题中描述的行为或解决所描述的问题*。 – Quentin

+0

你是对的,我忽略了正确地阅读问题并假设他的问题,正如前面提到的,我根据不完整的上下文做出了假设,并且未能正确理解这一点:“现在,出于一些奇怪的原因,我看到POST请求,控制台,如: http://website.com/controller?id=2“这清楚地表明他没有直接通过HTTP提交表格,如果他是他的问题不可能是他所描述的。我删除了我的整个答案。 –

0

我感谢大家花时间。

最后一步:我想我不能使用Ajax,因为每次我帖子的时候,它得到的最后id产生form因此,如果有n多种形式,POST每一个提交按钮会像:

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

如果只有大约一个表格,那就不成问题了。但由于form发生的可靠性,AJAX失败。

顺便说一句,这是我一直在使用Ajax代码:

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){} 
)}; 

或许,我没有用ajax正常。

+0

如果你想得到它的工作,请看看我的答案。你所显示的jQuery代码完全不符合我描述的问题。您的选择器只能处理页面加载时存在的任何表单 - 而不是稍后动态添加的任何表单。此外,由于您用于查找网址的选择器只会匹配您的“st_blog_comment_form”表单,而不是您当前提交的表单,所以它们都会POST到同一个单一网址。试试我的代码,并让我知道你是否有任何问题 - 你快到了! :-) –

+0

在页面加载时,每个表单(它们都是动态生成的)都存在,在开发工具中很容易检查它们的'form'。 – chandlerbing