2017-10-17 105 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