codeigniter更新数据库,对于选中的项目为“TRUE”,对于剩余的未检查项目为“FALSE”

时间:2012-10-11 17:35:23

标签: codeigniter

我是php / codeignitor的新手,并尝试将表单复选框上的更改发布到我的数据库。要修改的行由下面的gl_id分配。 我不知道如何在模型中使用我的update_checked函数 对其中每个字段发送TRUE,其中gl_id = x和FALSE使用不在数组中的其余字段。我可以使用控制器中的$ _POST ['checked']创建和查看已检查值的数组 并将其传递给模型。现在我需要使用这个数组发布到数据库,其中gl_id =视图中表单的值。

在视图中

    <h1>Update GL id <?php echo $gl_field['gl_id'];?></h1>
        <label>Stat</label>
            <input type="checkbox" <?php if ($gl_field['stat'] == "TRUE") {echo "checked = checked";} ?>   
            name = "checked[]" id="stat" value= "stat"  /><BR CLEAR="all">
        <label>Exclude</label>
            <input type="checkbox" <?php if ($gl_field['exclude'] == "TRUE") {echo "checked = checked";} ?>  
            name="checked[]" id="exclude" value= "exclude"><BR CLEAR="all">
        <label>Override</label>
            <input type="checkbox" <?php if ($gl_field['override'] == "TRUE") {echo "checked = checked";} ?>          
            name= "checked[]" id= "override" value = "override"/><BR CLEAR="all">

在控制器

            public function update_table(){
               $this->load->helper('form');
               $this->page_nav_model->update_table();
               $checked_array = $_POST['checked'];
               $this->page_nav_model->update_checked($checked_array);
               $this->load->view('pages/success');
            }

在模型中

    foreach($checked_array as $true){
            echo $true;                             
        }

为了澄清当我将信息提取到上面示例中的表单时,所有复选框都在数据库中设置为“TRUE”,以便检查它们。如果我取消选中stat并单击提交,我可以看到一个包含值的数组(排除,覆盖)。

我感谢任何能帮助我朝着正确方向前进的帮助。

3 个答案:

答案 0 :(得分:0)

如果HTML中未选中复选框,则不会通过$ _POST发送该值。这在CodeIgniter中没有考虑到。这就是我处理这个问题的方法。在控制器中:

/**
 * Set post values for unchecked boxes.
 *
 * @access private
 * @return void
 */
private function _section_checkboxes()
{
    if (!$this->input->post('is_active')) {$_POST['is_active'] = 0;}
    // other checkboxes here...
}

/**
 * if form validation passes, run this to edit a section
 *
 * @access public
 * @return void
 */
public function do_edit_section()
{
    $this->_section_checkboxes();
    if ($this->section_model->edit_section($this->input->post()))
    {
        redirect('success_page');
    }
}

在模型中:

/**
 * updates a section with active record, returns success.
 * 
 * @access public
 * @param array $data
 * @return bool
 */
public function edit_section(array $data)
{
    $this->db->where('id', $data['id']);
    return $this->db->update('sections', $data);
}

在视图中,使用表单助手:

<?=form_checkbox(array('name' => 'is_active', 'id' => 'is_active_field', 'value' => '1', 'checked' => (bool)$item->is_active))?>

现在未经检查的复选框在未选中时设置为0,在选中时设置为1。我希望这能回答你的问题。

答案 1 :(得分:0)

要一次性更新CI,您需要一个这样的数组:

    $data = array(
        'column_1_name' => 'value_to_insert'
        'column_2_name' => 'value_to_insert'
        'column_2_name' => 'value_to_insert'
    );

现在,你有一个像这样的数组$ checked_array =('stat','exclude','override') - 有更多或更少的成员。

要创建可在update语句中使用的数组(如上面的$ data),您需要做的是创建另一个数组,其中包含每列的名称,如果它位于$ checked_array中,则值等于1或0如果它不在$ checked数组中。

下面的函数add_values()可以为您完成。你必须提供两个参数:

  1. $ all_possibilities是每个列名称的数组,您希望将其更新为1或0.在这种情况下,它应该看起来像$ all_possibilities = array('stat','exclude','override');
  2. $ selected:这是一个包含实际选中框的名称的数组 - 它是$ all_possibilities的一个子集(如果选中所有框,则它是相同的。)
  3. 此功能在您的控制器中。

        function add_values($all_possibilities, $selected) {
    
            $array_for_query = array();
            // this goes through each possible box that can be checked to see if that possibility was actually selected
            foreach($all_possibilities as $array_member) {
                // this checks to see if the current member of $all_possibilities is found in the $selected array
                if (in_array($array_member, $selected)) {
                        // if it is, it adds that as a member of a new query $array_for_query and gives it a value of 1 (true)
                        $array_for_query[$array_member] = 1;
                    } else {
                        // if it is not, same as above, but gives it a value of 0
                        $array_for_query[$array_member] = 0;        
                    }
            }
    
            // once all the possibilities have been checked and added to the query array, that array is returned
            return $array_for_query;
        }
    

    现在你可以调用函数并传入两个参数。返回的数组被赋值给$ checked_and_unchecked。

        $data['checked_and_unchecked'] = add_values($possibilities, $checked_array);
    

    确保你也从表单中获取gl_id。您可以在视图中使用隐藏字段执行此操作:

        <input type="hidden" name="gl_id" value="<?php echo $gl_field['gl_id'];?>" />
    

    在控制器中,使用

    获取该值
        $data['gl_id'] = $this->input->post('gl_id');
    

    然后,您可以将信息传递给模型,并通过表格名称和您创建的数组更新表格。

        $this->model_name->model_method($data);
    

    然后将进入模型:

        $this->db->update('table_name', $checked_and_unchecked);
        $this->db->where('gl_id', $gl_id);
    

答案 2 :(得分:0)

所以我仍然需要帮助对整个项目进行最后的修改,所以我想在这里发布最终结果给任何人绿色,因为我希望控制数据库中的复选框和复选框中的数据库。

控制器:

    [function from Tayler and]
    $all_checkbox_fields = array('stat','exclude','override');  
        $checked_array = $_POST['checkbox'];
        $data['checkbox'] = $this->add_values($all_checkbox_fields, $checked_array); 
        $data['gl_id'] = $this->input->post('gl_id');
        $this->page_nav_model->update_checked($data); 
        $this->load->view('pages/success');

型号:

    public function update_checked($data){
        $this->default_db->where('gl_id', $data['gl_id']); 
        $this->default_db->update('oracle_table', $data['checkbox']); 
    }

查看:

    <label>Stat</label>
        <input type="checkbox" <?php if ($gl_field['stat'] == "1") {echo "checked = checked";} ?>   
        name = "checkbox[]" id="stat" value= "stat"/><BR>
    <label>Exclude</label>
        <input type="checkbox" <?php if ($gl_field['exclude'] == "1") {echo "checked = checked";} ?>  
        name="checkbox[]" id="exclude" value= "exclude"/><BR>
    <label>Override</label>
        <input type="checkbox" <?php if ($gl_field['override'] == "1") {echo "checked = checked";} ?>          
        name= "checkbox[]" id= "override" value = "override" ><BR>