2012-10-17 53 views
0

我的印象是,解析HTML表單的POST的服務器代碼(或至少PHP)無法區分POST與表單之間的複選框,而該複選框的值未被「檢查「而不是根據該名稱包含複選框的表單中的POST。區分缺失和未選中複選框

例如,採取以下3種形式。如果他們都提交的是,沒有手工錄入,只是用inital值,然後形成F2和F3將發送相同的結果:

<form name="f1"> 
<input type="text" name="txt_1" value="Hello"> 
<input type="checkbox" name="chk_1" checked="checked"> 
</form> 

<form name="f2"> 
<input type="text" name="txt_1" value="Hello"> 
<input type="checkbox" name="chk_1"> 
</form> 

<form name="f3"> 
<input type="text" name="txt_1" value="Hello"> 
</form> 

在我的實際應用中,我提交類型的表格f3,故意省略複選框(不同情況下的不同複選框)。對於我遺漏的任何複選框,我希望後端忽略它 - 不要將它視爲「開」或「關」,只是不做任何與該字段相關的操作。

當我建立它之後,在測試之前,我幾乎要拋棄我的工作,當我想起後端將會處理一個完全沒有選中的chk_1的缺失chk_1,並且會關閉後端的相關值。

但我去試了一下,它工作!我嘗試了不同的變化,他們都工作。他們正確地忽略與丟失複選框相關的字段(處理與現有複選框相關的字段時)。因此,這很好,但我不知道它是如何完成的(或者它是否會停止工作 - 例如在另一個瀏覽器上,等等)。在PHP中,我知道代碼isset($ _ POST ['chk_1'])將獲得複選框的值,並且在兩種情況下都會返回false:未選中複選框或缺少複選框。有其他服務器語言的方法可以區分嗎?爲什麼這個工作?

+2

http://www.w3.org/TR/html401/interact/forms.html#checkboxes – Musa

+0

感謝您的鏈接,儘管我可以在其中找到的是確認,我原來的理解是正確的:只有CHECKED複選框的輸入被認爲是成功的,因此通過POST提交。 我仍然不知道這個第三方Web服務如何能夠檢測到我完全省略了一個複選框,而不是將其視爲未經檢查的複選框,而是能夠確定它沒有被正確提交忽視它。 – oxfordian

+0

請指定一些服務的具體證據,區分缺失複選框和未選中複選框。 –

回答

0

簡單的答案是,PHP只獲取瀏覽器發送的內容。它不知道或關心表單本身,僅僅是來自瀏覽器的數據。數據以name=data值的集合形式出現。

除其他因素外,如果(a)它有一個名稱並且(b)它已被選中,瀏覽器將只發送一個按鈕。如果該按鈕沒有名字,或者沒有被選中,那麼PHP將永遠聽不到它。這不僅適用於普通按鈕(<button>或),也適用於單選按鈕(只能選擇一個組中的一個:如果沒有選中,則也不會),也適用於複選框(僅限選中的複選框) 。