2016-04-28 3 views
0

I私のフォームに次のコードは、複数のチェックボックスにはCodeIgniterの

アプリケーション/ビュー/ 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

チェックボックスの名前があるようにあなたがそれを作っています同じであり、投稿される投稿エントリは1つだけで、名前はbitmsgです。したがって、あなたが反復するときに$keyが配列に含まれているかどうかチェックしていますが、$keyはこの場合は常にbitmsgです。その結果、あなたの最初のifステートメントは本当ではありません。投稿配列にbitmsgのエントリが1つしか含まれていないため、elseif文が真になります(配列キーが常に同じ場合 - 1つのキーに1つの値があり、その値が最後に設定されている場合と同じです)。これは、最後にチェックされたアイテムが、あなたが期待したものを返す唯一のものであった場所で見た振る舞いを説明しています。あなたのelse声明については、私はあなたの意図が何であるか分かりません。あらかじめ設定された$dbEntry配列に値が0であることにより、暗黙的に 'else'条件が既に存在します。あなたはそれに慣れていない場合は、単に、その後、

<?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; ?> 

:別の方法として

、あなたはあなたのリストは、常にあなたのhtmlフォームの世代で、その後、$dbEntryに記載されているキーであることがわかっている場合は、のような何かをしますあなたのフォームでname$dbEntryのキーに変更してください。

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

注しかし、一般的に、それはあなたが提供しているデータを操作し、それに対して入力をチェックすると良いでしょう:あなたはあなたのアプローチに従うならば

次に、あなたのset_message()foreachは次のようになります。あなたが名前としての代わりbitmsgbitmsg[]を使用して配列に名前を変更することができ、

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

それとも怠惰な方法:

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

その後、あなたのモデルチェンジでモデルforeachコードは次のようになります。 $this->input->post()$this->input->post("bitmsg");となります。これにより、投稿データは選択されたアイテムの配列になります。この場合、$keyは常に整数インデックスになり、値は選択されたチェックボックスの値になります。 FYI ..

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

を第一に...あなたの詳細な説明のためにどうもありがとうございました..:$dbEntry$postDataを交換に関する

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

同じノートはここにも適用されます。だからあなたのモデルforeachループは次のようになります私が挿入する必要がある他のフィールドがあります(これはコードに表示されませんでした)。そして、私が考慮する必要がある他のキーがあります。そのため、最初の代替は、私のHTMLフォームのオプションではありません。私も 'bitmsg []'の配列を使用しようとしましたが、 '$ this-> input-> post( "bitmsg");を使用することはできません。これはbitmsg []の値を返すだけなので、他のinput-> post値は返しません。私はあなたの他の提案を試してみましょう。後でここで更新します。 – Julie

+0

他のデータが何であるかのコンテキストがなければ、誰かが意味を持って答えるのは難しいです。すべてのポストデータを繰り返し処理し、 'bitmsg []'メソッドを使いたいならば、$ postData foreach内に$ keyが 'bitmsg'であるかどうかをチェックし、その配列のネストされたforeachを行うことができます。ポストリターンの中のその一つのキーの下にある値の配列です。 – caseyh

+0

'$ dbEntry'の' $ keys'に 'name'を変更しました。それは動作しますが、' set_message() 'に特別なチェックを追加する必要があります。フォームには、チェックボックス、ラジオ、ドロップダウンオプション、および通常の入力テキストを含む入力のミックスタイプが含まれています。 '$ key'の中には同じ' name'を使っているものがあります。それに応じてそれを変更する必要があります。しかし、まあ..それは私のマルチチェックボックスのために働いていた限り..私は変更気にしない.. :)あなたの助言のために再びありがとう.. – Julie