2011-11-02 28 views
12

無法讓我的POST數組顯示來自我的表單的所有複選框值。POST數組未顯示未選中複選框

我已成立的一種形式如下:

<form name='foo' method='post' action=''> 
    <table> 
     <tr> 
      <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> 
     </tr> 
     <tr> 
      <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> 
     </tr> 
     <tr> 
      <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> 
     </tr> 
    </table> 
</form> 

我在綁定到該增加5個更多的空行的形式(因此對於輸入名稱CBOX陣列一個jquery函數底部有一個按鈕[])。

現在,問題所在。比方說,第一個複選框未選中,最後2個選中。當我輸出的值(使用調試PHP的print_r),我會得到:

Array ([0] => on [1] => on) 

出於某種原因,該陣列不包含未選中的複選框的任意值。

我已經看到一些解決方案,每個複選框都會傳遞一個隱藏變量,但是這種解決方案可以在我的情況下實現(使用數組)嗎?

+0

聽起來很簡單..我會給它一個:)謝謝 – SpaghettiMonster

+0

不幸的是,我仍然沒有得到未經檢查的值。雖然 – SpaghettiMonster

+0

我意識到我之前的評論是出於對你的問題完全錯誤理解的動機。我在下面添加了一個正確的答案。 – Jon

回答

16

這種行爲並不令人驚訝,因爲瀏覽器不會爲未選中的複選框提交任何值。

如果您處於需要以數組的形式提交確切數量的元素的情況,那麼爲什麼當與每個複選框關聯的某種排序的id時您做同樣的事情?只是包括PHP數組的鍵名作爲<input>元素的名稱的一部分:

<tr> 
                 <!-- NOTE [0] ---> 
     <td class='bla'>Checkbox: <input type='checkbox' name='cBox[0]'/></td> 
    </tr> 
    <tr> 
     <td class='bla'>Checkbox: <input type='checkbox' name='cBox[1]'/></td> 
    </tr> 
    <tr> 
     <td class='bla'>Checkbox: <input type='checkbox' name='cBox[2]'/></td> 
    </tr> 

這仍然留下你的問題是選中框將仍然不會出現在數組中。這可能也可能不是問題。其中之一,你可能真的不在乎:

foreach($incoming as $key => $value) { 
    // if the first $key is 1, do you care that you will never see 0? 
} 

即使你照顧,你可以很容易地糾正問題。兩個直接的方法在這裏。一,只是做了隱藏輸入元素招:

<tr> 
     <td class='bla'> 
     <input type="hidden" name="cBox[0]" value="" /> 
     Checkbox: <input type='checkbox' name='cBox[0]'/> 
     </td> 
    </tr> 
    <tr> 
     <td class='bla'> 
     <input type="hidden" name="cBox[1]" value="" /> 
     Checkbox: <input type='checkbox' name='cBox[1]'/> 
     </td> 
    </tr> 

兩個,我覺得最好,填補了從PHP代替空格:

// assume this is what comes in: 
$input = array(
    '1' => 'foo', 
    '3' => 'bar', 
); 

// set defaults: array with keys 0-4 all set to empty string 
$defaults = array_fill(0, 5, ''); 

$input = $input + $defaults; 
print_r($input); 

// If you also want order, sort: 

ksort($input); 
print_r($input); 

See it in action

+0

謝謝喬恩。我會研究這個解決方案。我唯一關心的是獨特的名字。我有一個未知數量的輸入,因爲它們與jquery .clone()一起添加。此外,您的鏈接不起作用,您可以使用網址縮短嗎? – SpaghettiMonster

+1

@SpaghettiMonster:鏈接固定(複製粘貼失敗)。即使克隆,您也可以鏈接一些額外的jQuery方法來在克隆生成後設置名稱。 – Jon

+0

謝謝喬恩。我添加了幾行jQuery來計算現有行數,並使用它來增加數組位置,並使用上面的代碼。完美運作! :) – SpaghettiMonster

2

嘗試

<input type='checkbox' value="XXX" name='cBox[]'/> 
<input type='checkbox' value="YYY" name='cBox[]'/> 
<input type='checkbox' value="ZZZ" name='cBox[]'/> 

複選框工作方式。如果它被選中,只有這個值被髮布。

+0

我試過了,我得到的結果是:Array([0] => YYY [1] => ZZZ)。不幸的是,我不能給每個輸入的唯一值,因爲可以通過我提到的jquery函數動態添加。 – SpaghettiMonster

+1

那麼用你需要的值替換YYY,ZZZ。然後檢查$ _POST ['cBox'](它是一個數組)是否包含所需的值。 –

0

嘗試設置每個複選框的值爲1或true。

<input type='checkbox' value='1' name='cBox[1]'/> 

這可能是爲什麼它不發送任何東西?

4

ONE TRICK將覆蓋複選框的值(如果選中)。否則其值將爲0。

<form> 
    <input type='hidden' value='0' name="smth"> 
    <input type='checkbox' value='1' name="smth"> 
</form> 
+0

雖然你的邏輯是真實的,但這並不回答這個問題,因爲如果你有一個數組然後foreach與密鑰對將不正確 –

1

如果您在處理動態複選框數組,你可以試試這個:

HTML:

<label> 
    <input type="hidden" name="cBox[]" value="" /> 
    <input type="checkbox" class="checkbox" value="on" /> 
</label> 
<label> 
    <input type="hidden" name="cBox[]" value="" /> 
    <input type="checkbox" class="checkbox" value="on" /> 
</label> 
<!-- extend --> 

的Javascript(jQuery的):

$(document).on("change", "input.checkbox", function() { 

    var value = $(this).is(":checked") ? $(this).val() : null; 

    $(this).siblings("input[name='cBox[]']").val(value);  
}); 

後端結果(如果只檢查第二個):

// PHP $_POST['cBox'] 
Array 
(
    [0] => 
    [1] => on 
) 

在此實現中,複選框用於控制組中的每個隱藏輸入。

對於顯示頁面,您可以通過將值分配給隱藏輸入並將複選框標記爲checked來呈現每個輸入對。

+0

真的幫助完整..謝謝! –

+0

很高興聽到:) –