无法在CodeIgniter中获取多个复选框的值

时间:2016-04-28 02:58:15

标签: php codeigniter checkbox

我的表单中有以下代码可以提交多个复选框

应用/视图/ 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只返回我检查的最后一个复选框。 E.g:

$ postData返回“MsgType1,0,0,0,0,0,0,1”&lt;&lt; =如果全部选择

$ postData返回“MsgType2,0,0,0,0,0,1,0”&lt;&lt; =如果我选择除S-113以外的所有

缺少一些东西,我找不到它......:/

1 个答案:

答案 0 :(得分:1)

您已将其设置为使复选框的名称相同,因此只提交了一个提交的帖子条目,其名称为bitmsg。因此,当您进行迭代时,您正在检查数组中是否$key,但在这种情况下,$key始终为bitmsg。因此,您的第一个if声明永远不会成立。您的elseif语句最终为真,因为您的post数组只包含bitmsg的一个条目(就像您的数组键总是相同的情况一样 - 一个键有一个值,值是最后一个一个设置)。这解释了您看到的最后一个项目按顺序检查的行为是唯一一个返回您预期的项目。至于你的else声明,我不确定你的意图是什么。通过将预先填充的$dbEntry数组作为值设置为零,您已经隐式地具有“其他”条件。

作为替代方案,如果您知道您的列表始终是$dbEntry中列出的键,那么在您的html表单生成中执行以下操作:

<?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代码如下所示:

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

或者懒惰的方式,您可以使用bitmsg[]作为名称而不是bitmsg将名称更改为数组:

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

然后在您的模型中将$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;
    }
}