2015-06-28 60 views
6

我有一個表格看起來像:製作複選框返回false時選中

<form> 
    <input type"checkbox" name="checked[(unique_id)]"> 
    <input type"checkbox" name="checked[(unique_id)]"> 
    <input type"checkbox" name="checked[(unique_id)]"> 
    <input type"checkbox" name="checked[(unique_id)]"> 
</form> 

複選框會從變動內容不時的數量,以便與PHP處理這些數據時,我有循環的_POST['checked']陣列。

我的問題是,我想在選中複選框時以及不復選框時執行操作。但只有選中的複選框纔會被添加到_POST['checked']陣列中。

+1

你不能用html做,所以你有2個選項1使用javascript,2使用下拉列表而不是複選框 – robert

+1

爲什麼不把它添加到你的php: $ checked = isset(_POST ['checked']) && _POST ['checked'] == 1; – sabkaraja

+0

@robert我很懷疑,在這種情況下,下拉列表並不是一種替代方案,但我更多地打開基於JS的解決方案。我將如何去與JS做這個? (我對JS的經驗非常有限) – Gurgy

回答

1
<form> 
    <input type="checkbox" key="1"/> 
    <input type="hidden" name="checked[1]" value="false"> 
    <input type="checkbox" key="2"/> 
    <input type="hidden" name="checked[2]" value="false"> 
    <input type="checkbox" key="3"/> 
    <input type="hidden" name="checked[3]" value="false"> 
    <input type="checkbox" key="4"/> 
    <input type="hidden" name="checked[4]" value="false"> 
</form> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
<script> 
    $(document).ready(function() { 
     $('[key]').change(function() { 
      var key = $(this).attr('key'); 
      $($('[name="checked[' + key + ']"]')).val($(this).is(':checked') ? 'true' : 'false'); 
     }); 
    }); 
</script> 

這裏是我在做什麼

我使用兩個輸入一個沒有名字的複選框,這樣就不會被髮送到PHP ,另一個是隱藏的將不會顯示給用戶,但它是什麼將發送到php

然後用jquery當用戶選中框jquery將隱藏輸入的值更改爲true,當取消選中它時更改該值爲假

因此該值將始終發送到PHP和值true或false string

你可以改變你要發送通過改變這個 .is(':checked')?'true':'false') 到類似的東西.is(':checked')?1:0)到PHP送1的值, 0,而不是真假

另一種解決方案是rybo111解決

<input type="hidden" name="check" value="false"> 
<input type="checkbox" name="check" value="true"> 

它將把兩個選項,但如果選中該複選框我T將覆蓋第一個選項

,但它是不可靠的100%,這將更多的數據發送到服務器

閱讀更多有關在POSTing Form Fields with same Name Attribute

,所以如果你想使用沒有JS簡單的解決方案使用「HTML僅」 如果你想100%可靠的解決方案用「JS」

+0

非常感謝,這個問題一直困擾着我好幾天,我甚至明白你在那裏做了什麼:P – Gurgy

+0

haha​​ha:D你非常歡迎,我很高興你明白這一點,你必須學習js和jquery對網絡開發非常重要 – robert

+0

我的答案不需要JavaScript – rybo111

0

value="true"添加到每個複選框輸入元素。 ,改變你的PHP代碼:

$checked_arr = []; 
foreach($_POST["checked"] as $checked){ 
    if($checked == "true"){ 
     // do what you want to do 
    } 
} 
+4

糾正我,如果我錯了,但不會'$ _POST [「選中」]仍然只包含選中的複選框? – Gurgy

3

這裏是我以前見過的技術:

<input type="hidden" name="check" value="false"> 
<input type="checkbox" name="check" value="true"> 

這個原因起作用的原因是,當同名的值被多次發送時,只有最後一個值被接受。

在我看來,更好的方法是簡單地使用isset($_POST['...'])in_array($_POST['...'])

+0

+1這是很好的解決方案,但有一個問題,這個解決方案是不可靠的,因爲某些瀏覽器可能會發送第一個值 – robert

+2

@robert你有什麼瀏覽器發送第一個值的數據嗎? – rybo111

+1

我不知道是否有一些瀏覽器做到這一點,但例如,當我使用''發送數據到php,但現在類型提交won將不會發送到服務器 – robert

0

另一個解決方案是服務器端解決方案,我認爲它太快而且容易。

客戶端: 只需使用新的HTML:

<input type="checkbox" name="checked1" value="value_checked" ... /> 

服務器端:

使全局函數是這樣的:

function getVal(&$var, $default = '') { 
    if (!isset($var) || empty($var) || is_null($var)) 
     $var = $default; 
    return $var; 
} 

然後使用要讀一些你不知道的價值。 這樣的:

$checked_value = getVal($_POST["checked1"],false); 

$checked_value = getVal($_POST["checked1"],"value_not_checked"); 

希望對大家有用到另一個。