1

我正在尝试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. 如何正确地将数组传递给模型以便更新运行?

一如既往地提前感谢。

4

2 回答 2

1

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

<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条件将返回 false 。editcustomer您的表单中也没有id字段,在这种情况下您不能使用$this->input->post('id'),因此如果您需要检查模型中的复选框 id,where clause那么您可以使用

在控制器中:

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,,因为您可能不想更新此字段。此外,您应该在更新记录之前使用表单验证来检查表单输入(您可以设置绑定用户输入邮政编码所需的邮政编码字段)。

在模型中:

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');
}
于 2013-03-02T23:16:51.937 回答
1

与“Codeigniter 从带有 CI 的表单更新 mysql 表”的重复主题?

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

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

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

你的模型是错误的。它应该是:

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

你不需要写$this->db->where('id',$this->input->post('id'));(这是错误的,因为你不能在你的模型中使用 $this->input->post() )因为你已经传入id$updaterow.

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

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

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

function update_customer_records($updatedrow)
{
    $this->db->update('customers', $updatedrow, array('id' => $this->input->post('id')));
}
于 2013-03-02T21:32:45.033 回答