Codeigniter - 从表单更新表格,带复选框

时间:2013-03-02 21:09:22

标签: forms codeigniter checkbox updates multiple-records

我正在尝试使用MySQL更新Codeigniter表。

我的型号代码是:

function update_customer_records($updatedrow)
{
    $this->db->where('id',$this->input->post('id'));
    $this->db->update('customers',$updatedrow);
}

我的观点是:

    $attributes=array(
        'name'=>'updatecustomer',
        'id'=>'updatecustomer',
        );
    echo form_open('masterdata/manage_customers',$attributes);
?>

<table>
    <tr>
        <td>&nbsp;</td><td>&nbsp;</td><td>Customer Name</td><td>postalcode</td>
    <tr>

<?php if(isset($records)) : foreach ($records as $row) : ?>
    <tr>
        <td>
<?php echo anchor('masterdata/customers_updated/'.$row->id, img(array('src'=>'images/delete_icon.png','border'=>'0','alt'=>'Delete'))); ?>
        </td>
        <td>
            <input type=checkbox name="editcustomer[]" id="editcustomer[]" value="<?php echo $row->id ?>">
        </td>
        <td>
            <input type="text" name="customername_<?php echo $row->id ?>" id="customername_<?php echo $row->id ?>" value="<?php echo $row->customer_name ; ?>" >
        </td>
        <td>
            <input type="text" name="customername_<?php echo $row->id ?>" id="customername_<?php echo $row->id ?>" value="<?php echo $row->postalcode ; ?>" >
        </td>
    </tr>
<?php endforeach ; ?>
    </table>
<input type="submit" value="Update Selected">
<?php else : ?>
<h2> No Records Found</h2>
<?php endif; ?>
<?php echo form_close(); ?>

我的控制器是:

function manage_customers()
    {

        $data['title']="Manage Customers";

            //query model to get data results for form
            $data=array();

            if($query=$this->model_master_data->get_records()){
                $data['records']=$query;


            $this->load->view("master_data/view_master_data_header",$data);
            $this->load->view("master_data/view_master_data_nav");
            $this->load->view("master_data/view_content_master_data_manage_customers",$data);
            $this->load->view("master_data/view_master_data_footer");


            $editcustomer = $this->input->post('editcustomer');

            if(isset($editcustomer)){

                //begin outputting id of selected checkbox
                foreach ($editcustomer as $row) :
                    echo $row;

                $updatedrow=array(
                    'id'=>$row,
                    'postalcode'=>'44444'
                    );


                $this->model_master_data->update_customer_records($updatedrow);

                endforeach;
            }

我有两个问题:

  1. 如果未选中复选框,如何停止foreach运行。
  2. 如何正确地将数组传递给模型以便更新运行?
  3. 一如既往地感谢您。

2 个答案:

答案 0 :(得分:2)

首先,我在表单中找到了两个具有相同名称和ID的字段(如下所示),在一个字段中设置了它的值customer_name,在另一个字段中设置了postalcode。< / p>

<td>
    <input type="text" name="customername_<?php echo $row->id ?>" id="customername_<?php echo $row->id ?>" value="<?php echo $row->customer_name ; ?>" >
                                --^^--
</td>
<td>
    <input type="text" name="customername_<?php echo $row->id ?>" id="customername_<?php echo $row->id ?>" value="<?php echo $row->postalcode ; ?>" >
                                --^^--
</td>

所以我认为(可能)根据它的值,第二个字段的名称和id应为postalcode

此外,您不必担心foreach循环,因为循环内的代码只有在表单上有复选框时才会运行,因为未提交未选中的复选框但您可以检查使用以下代码运行循环

if( $this->input->post('editcustomer') != false )
{
    foreach ($editcustomer as $row)
    {
        // code here
    }
}

如果找不到if或未随表单提交,则editcustomer条件将返回false。此外,您的表单中没有id字段,在这种情况下您无法使用$this->input->post('id'),因此如果您需要检查模型的where clause中的复选框ID,那么您可以使用

在控制器中:

if( $this->input->post('editcustomer') != false )
{
    $this->load->model('model_master_data');
    foreach ($editcustomer as $row_id)
    {
        $data = array( 'postalcode' => '44444' );
        $this->model_master_data->update_customer_records( $row_id, $data );
    }
}

我认为你不需要传递'id'=>$row,因为你可能不想更新这个字段。此外,您应该在更新记录之前使用form validation检查表单输入(您可以设置绑定用户输入邮政编码所需的邮政编码字段)。

在模型中:

function update_customer_records( $id, $data )
{
    $this->db->where( 'id', $id );
    $this->db->update( 'customers', $data );
}

所以它会做这样的事情(伪代码)

update the customers table set `postalcode` = '44444' where `id` = $id

更新 我想你也可以使用update_batch

在控制器中:

if( $this->input->post('editcustomer') != false )
{
    $data = array();
    foreach ($editcustomer as $row_id)
    {
        $data[] = array( 'id' => $row_id, 'postalcode' => '44444';
    }
    $this->load->model('model_master_data');
    $this->model_master_data->update_customer_records( $data );
}

在模型中:

function update_customer_records( $data )
{
    $this->db->update_batch('customers', $data, 'id');
}

答案 1 :(得分:1)

使用"Codeigniter update mysql table from form with CI"重复主题?

  

如果未选中复选框,如何停止foreach运行。

如果未选中复选框,则无需停止foreach运行。 因为$editcustomer变量只包含复选框。

  

如何正确地将数组传递给模型以便更新运行?

你的模特错了。它应该是:

public function update_customer_records($updatedrow)
{
    $this->db->update('customers', $updatedrow);
}

你不需要写$this->db->where('id',$this->input->post('id'));(这是错误的,因为你不能在你的模型中使用$ this-&gt; input-&gt; post()),因为你已经通过{{1} } id

编辑:对不起,我太快读了你的代码!

$updaterow

......是对的。或者,您可以用更短的方式编写它:

function update_customer_records($updatedrow)
{
    $this->db->where('id',$this->input->post('id'));
    $this->db->update('customers',$updatedrow);
}