在Codeigniter中将数组更新到数据库

时间:2019-07-12 03:42:33

标签: php codeigniter

对于我的代码,当我选中该复选框时,它将从数据库中检索日期和价格,并进行计算以获得总价。

但是它将更新所有具有相同值的行。

我试图选择3复选框,然后var_dump总价,结果是正确的。

但是我想更新到数据库,它用相同的值更新了所有行。

控制器:

            $PledgeCheckbox =  ($this->input->post('batch_pledge[]')  ? '1' : '0');
            //$Pledge_No = $this->input->post('batch_pledge[]'); //return value of pledge_id

            if($PledgeCheckbox == '1'){
                $Pledge_No = $this->input->post('batch_pledge[]'); //return value of pledge_id

                //take the stg_fee_per_mth from database and calculate $Total_Stg_Fee
                $Pledge = $this->pledge->GetPledgeStgFee($Pledge_No);
                foreach($Pledge as $row){
                    $Stg_fee_per_mth = $row->stg_fee_per_mth;
                    $Pledge_date = $row->pledge_date;

                    $DATE_NOW = strtotime($Cur_date);
                    $DATE_PREV = strtotime($Pledge_date);

                    $Year1 = date('y', $DATE_NOW);
                    $Year2 = date('y', $DATE_PREV);

                    $Month_Now = date('m', $DATE_NOW);
                    $Month_Prev = date('m', $DATE_PREV);

                    $Month_diff = (($Year1 - $Year2)*12)+($Month_Now - $Month_Prev);

                    if($Month_diff !== 0){
                        $Total_Stg_Fee = $Stg_fee_per_mth * $Month_diff;

                        //update $Total_Stg_fee in database
                        $this->pledge->UpdatePledgeTotalStgFee($Total_Stg_Fee,$Month_diff);
                        //var_dump($Total_Stg_Fee);
                    }else{
                        //if $Month_diff == 0, $Stg_fee_per_mth must multiple with 1, if not $Total_stg_Fee will become 0
                        $Month_diff = 1;
                        $Total_Stg_Fee = $Stg_fee_per_mth * 1;

                        //update $Total_Stg_fee in database
                        $this->pledge->UpdatePledgeTotalStgFee($Total_Stg_Fee,$Month_diff);

                        //var_dump($Total_Stg_Fee);
                    }

                }
                $data['pledge'] = $this->pledge->FetchPledge2Renew($Pledge_No);
                $this->load->view('auth/header',$data);
                $this->load->view('pledge/batch_renew_pledge',$data);
                $this->load->view('pledge/footer',$data);
            }

型号:

    public function UpdatePledgeTotalStgFee($Total_Stg_Fee,$Month_diff){
        $post = $this->input->post();
        //$Month_diff = $post;
        //$Total_Stg_Fee = $post;

        foreach($post['batch_pledge'] as $k => $value){
        $TotalStgFee[] = array(
                                'pledge_id' => $value,
                                'no_of_mth' => $Month_diff,
                                'total_stg_fee' => $Total_Stg_Fee                 
                             );
        }
        $this->db->update_batch('pledge',$TotalStgFee,'pledge_id'); //('table','array','condition')
    }

var_dump($ TotalStgFee)的输出

C:\wamp64\www\kde\store\application\models\Pledge_model.php:683:
array (size=2)
  0 => 
    array (size=3)
      'pledge_id' => string '27' (length=2)
      'no_of_mth' => int 1
      'total_stg_fee' => float 20
  1 => 
    array (size=3)
      'pledge_id' => string '21' (length=2)
      'no_of_mth' => int 1
      'total_stg_fee' => float 20
C:\wamp64\www\kde\store\application\models\Pledge_model.php:683:
array (size=2)
  0 => 
    array (size=3)
      'pledge_id' => string '27' (length=2)
      'no_of_mth' => int 36
      'total_stg_fee' => float 900
  1 => 
    array (size=3)
      'pledge_id' => string '21' (length=2)
      'no_of_mth' => int 36
      'total_stg_fee' => float 900

1 个答案:

答案 0 :(得分:0)

要迭代发布的复选框输入,最好使用foreach而不是for循环,因为$post['pledge_id']数组索引并不总是顺序的。我已将您的代码更改为仅在foreach循环之后才调用update方法:

控制器

$PledgeCheckbox =  ($this->input->post('batch_pledge[]')  ? '1' : '0');
//$Pledge_No = $this->input->post('batch_pledge[]'); //return value of pledge_id

if($PledgeCheckbox == '1'){
    $Pledge_No = $this->input->post('batch_pledge[]'); //return value of pledge_id

    //take the stg_fee_per_mth from database and calculate $Total_Stg_Fee
    $Pledge = $this->pledge->GetPledgeStgFee($Pledge_No);
    if (!empty($Pledge)) {
        $Total_Stg_Fee = [];
        $Month_diff = [];
        foreach($Pledge as $k => $row){
            $Stg_fee_per_mth = $row->stg_fee_per_mth;
            $Pledge_date = $row->pledge_date;

            $DATE_NOW = strtotime($Cur_date);
            $DATE_PREV = strtotime($Pledge_date);

            $Year1 = date('y', $DATE_NOW);
            $Year2 = date('y', $DATE_PREV);

            $Month_Now = date('m', $DATE_NOW);
            $Month_Prev = date('m', $DATE_PREV);

            $Month_diff[$k] = (($Year1 - $Year2)*12)+($Month_Now - $Month_Prev);

            if($Month_diff[$k] !== 0){
                $Total_Stg_Fee[$k] = $Stg_fee_per_mth * $Month_diff[$k];

                //update $Total_Stg_fee in database
                // $this->pledge->UpdatePledgeTotalStgFee($Total_Stg_Fee,$Month_diff);
                //var_dump($Total_Stg_Fee);
            }else{
                //if $Month_diff == 0, $Stg_fee_per_mth must multiple with 1, if not $Total_stg_Fee will become 0
                $Month_diff[$k] = 1;
                $Total_Stg_Fee[$k] = $Stg_fee_per_mth * 1;

                //update $Total_Stg_fee in database
                // $this->pledge->UpdatePledgeTotalStgFee($Total_Stg_Fee,$Month_diff);

                //var_dump($Total_Stg_Fee);
            }
        }
        $this->pledge->UpdatePledgeTotalStgFee($Pledge_No,$Total_Stg_Fee,$Month_diff);
    }
    $data['pledge'] = $this->pledge->FetchPledge2Renew($Pledge_No);
    $this->load->view('auth/header',$data);
    $this->load->view('pledge/batch_renew_pledge',$data);
    $this->load->view('pledge/footer',$data);
}

模型

public function UpdatePledgeTotalStgFee($Pledge_No,$Total_Stg_Fee,$Month_diff){
    // $post = $this->input->post();
    //$Month_diff = $post;
    //$Total_Stg_Fee = $post;
    // $arraySize = count($post['pledge_id']);
    /*
    for($k=0; $k<$arraySize; $k++){
        $TotalStgFee[] = array(
                                'pledge_id' => $post['pledge_id'][$k],
                                'no_of_mth' => $Month_diff.[$k],
                                'total_stg_fee' => $Total_Stg_Fee.[$k]                  
                            );
    }
    */
    $TotalStgFee = [];
    foreach($Pledge_No as $k => $value){
        $TotalStgFee[$k] = array(
                                'pledge_id' => $value,
                                'no_of_mth' => $Month_diff[$k],
                                'total_stg_fee' => $Total_Stg_Fee[$k]
                            );
    }
    $this->db->update_batch('pledge',$TotalStgFee,'pledge_id'); //('table','array','condition')
}

这将首先将每个$Total_Stg_Fee$Month_diff保存为一个数组,然后将其作为批处理插入。我还在$Pledge_No函数上添加了UpdatePledgeTotalStgFee()作为参数,并将其传递给模型。