2016-04-28 95 views
0

我在表格下面的代碼提交多個複選框不能得到笨

應用程序/視圖/ form.php的

<form action="<?php echo base_url().'admin/addMessage/'.$pd_name; ?>" method= "POST"> 
<div class="form-group"> 
    <label><strong>Message Type *</strong></label> 
    <input type="text" class="form-control" name="msg_type" id="msg_type" placeholder="Enter Message Type" required> 
</div> 
<label><strong>Message Bit *</strong></label> 
<div class="form-group"> 
    <div class="checkbox">    
     <table class="table"> 
     <tbody> 
     <tr> 
      <td><label>   P-1 &nbsp;&nbsp;</label><input type="checkbox" checked disabled readonly /></td> 
      <td><label id="P17"> P-17 &nbsp;&nbsp;</label><input name="bitmsg" type="checkbox" value="P17"/></td> 
      <td><label id="P33"> P-33 &nbsp;&nbsp;</label><input name="bitmsg" type="checkbox" value="P33" /></td> 
      <td><label id="P49"> P-49 &nbsp;&nbsp;</label><input name="bitmsg" type="checkbox" value="P49"/></td> 
      <td><label id="S65"> S-65 &nbsp;&nbsp;</label><input name="bitmsg" type="checkbox" value="S65" /></td> 
      <td><label id="S81"> S-81 &nbsp;&nbsp;</label><input name="bitmsg" type="checkbox" value="S81" /></td> 
      <td><label id="S97"> S-97 &nbsp;&nbsp;</label><input name="bitmsg" type="checkbox" value="S97" /></td> 
      <td><label id="S113"> S-113 &nbsp;&nbsp;</label><input name="bitmsg" type="checkbox" value="S113"/></td> 
     </tr> 
     </tbody> 
     </table> 
    </div> 
</div> 
<button type="button" class="btn btn-default" id="reset" data-dismiss="modal">Cancel</button> 
<button type="submit" value="submit" class="btn btn-primary"> Add New Message Type</button> 
</form> 

應用/控制器/ admin.php的多個複選框值

public function addMessage($pdID) 
{ 
    $this->load->helper('form'); 
    $this->load->library('form_validation'); 

    $this->form_validation->set_rules('msg_type', 'MessageType', 'required'); 


    if ($this->form_validation->run() == FALSE) 
    { 
     echo '<script>alert("Please Select Valid Message Type"); window.history.back();</script>'; 
    } 
    else 
    { 
     $this->model_general->set_message($pdID); 
    } 

} 

應用程序/模型/ Model_general.php

function set_message() 
{ 
    $this->load->helper('url'); 
    $this->load->helper('form'); 

    //set default values  
    $dbEntry = array(
     'P17' => 0,'P33' => 0,'P49' => 0,'S65' => 0,'S81' => 0,'S97' => 0,'S113' => 0 
    ); 

    $postData = $this->input->post(); 

    foreach ($postData as $key => &$v) { 

     if (array_key_exists($key, $dbEntry)) { 

      $dbEntry[$key] = 1; 
     } 
     elseif ($key == 'bitmsg') { 

      $dbEntry[$v] = 1; 
     } 
     else { 

      $dbEntry[$key] = $v; 
     } 
    } 

    $this->db->insert('msg_format', $dbEntry); 
} 

我沒有選擇所有複選框..但$ postData只返回我檢查的最後一個複選框。例如:

$ POSTDATA回報 「MsgType1,0,0,0,0,0,0,1」 < < =如果選擇所有

$ POSTDATA回報「MsgType2,0,0,0,0, 0,1,0" < < =如果除了S-113我選擇所有

東西失蹤,我找不到它..:/

回答

1

你已經做了它,這樣的複選框的名稱是相同,因此只有一個帖子條目被提交,並且其名稱爲bitmsg。所以,當你迭代你正在檢查$key是否在陣列中,但在這種情況下$key始終是bitmsg。結果你的第一個if聲明永遠不會是真的。您的elseif聲明結果爲真,因爲您的發佈數組僅包含bitmsg的一個條目(正如您的數組密鑰始終相同 - 一個密鑰具有一個值並且該值是最後一個設置的值)。這解釋了您看到的最後一項檢查項目中唯一返回您所期望的行爲的行爲。至於你的else聲明,我不確定你的意圖是什麼。通過使用預填充的$dbEntry數組作爲值,您已經隱含地具有'else'條件。

作爲替代方案,如果你知道你的名單總是在你的HTML表單生成在$dbEntry上市,那麼鍵做類似:

<?php foreach ($dbEntry as $key => $v): ?> 
    <td><label id="<?php echo $key; ?>"> <?php echo $key; ?> &nbsp;&nbsp;</label><input name="<?php echo $key; ?>" type="checkbox" value="true"/></td> 
<?php endforeach; ?> 

如果你不舒服與,然後就請確保在您的表單中將name更改爲$dbEntry中的密鑰。

然後,你set_message()foreach應該是這樣的,如果你按照你的方法:

foreach ($postData as $key => $v) { 
    if (array_key_exists($key, $dbEntry)) { 
     $dbEntry[$key] = 1; 
    } 
} 

不過請注意,通常是更好地與你提供的數據工作,並檢查輸入反對。您的模型foreach代碼是這樣:在你的模型變化

<td><label id="S113"> S-113 &nbsp;&nbsp;</label><input name="bitmsg[]" type="checkbox" value="S113"/></td> 

然後:

foreach ($dbEntry as $key => $v) { 
    if (array_key_exists($key, $postData)) { 
     $dbEntry[$key] = 1; 
    } 
} 

或者偷懶的方法,您可以通過使用bitmsg[]的名稱,而不是bitmsg將名稱更改爲一個數組$this->input->post()$this->input->post("bitmsg");,以便您的發佈數據是所選項目的數組。在這種情況下,$key將始終是一個整數索引,並且該值將是所選複選框的值。所以,你的模型foreach循環可能看起來像:

foreach ($postData as $v) { 
    if (array_key_exists($v, $dbEntry)) { 
     $dbEntry[$v] = 1; 
    } 
} 

同一說明關於交換$dbEntry$postData這裏也適用:

foreach ($dbEntry as $key => $v) { 
    if (array_key_exists($v, $postData)) { 
     $dbEntry[$key] = 1; 
    } 
} 
+0

首先..非常感謝你爲你詳細解釋..僅供參考..還有其他字段需要插入(我沒有在代碼中顯示),還有其他鍵需要考慮,所以第一種替代方法不適用於我的html表單。我試圖使用'bitmsg []'數組',但我不能使用'$ this-> input-> post(「bitmsg」);'因爲它只會返回bitmsg []的值,但不會返回其他輸入 - >後值。我將嘗試其他建議..稍後將在此處更新.. – Julie

+0

如果沒有其他數據的上下文,則可能是很難讓人有意義地回答。如果你想迭代所有的post數據並使用'bitmsg []'方法,你可以在你的$ postData foreach中有一個if來檢查$ key是否是'bitmsg',並且在該數組上做一個嵌套的foreach,因爲現在它在返回後的內容中將是一個鍵下的數組。 – caseyh

+0

我在'$ dbEntry'中將'n​​ame'改爲'$ keys' ..它可以工作..但我需要在'set_message()'中添加額外的檢查,因爲它會影響我的表單中的其他字段。我的表單包含混合類型的輸入包括複選框,收音機,下拉選項和正常輸入文本。一些'$ key'使用相同的'name' ..所以我需要相應地改變它。但是,以及..只要它爲我的多複選框工作..我不介意改變.. :)再次感謝您的建議.. – Julie