Обновите массив в базу данных в Codeigniter - PullRequest
1 голос
/ 12 июля 2019

Для моих кодов: когда я устанавливаю флажок, он извлекает дату и цену из базы данных и выполняет расчет для получения общей цены.

Но обновляет все строки с одинаковым значением.

Я пытался установить флажок 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 голосов
/ 12 июля 2019

Чтобы выполнить итерацию введенного флажка, лучше использовать foreach вместо for цикла, поскольку индекс массива $post['pledge_id'] не всегда последовательный.Я изменил ваши коды, чтобы просто вызывать метод обновления только один раз после цикла foreach:

Контроллер :

$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() и передал его в модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...