2
\$\begingroup\$

I made a PHP script to check value before update. This script is working fine. But, I wonder how to simplify this. If there are hundreds of columns to be checked then it's hundreds of PHP lines.

This is used for saving a log file for update. So, if data is updated then it stores a log in a table.

public function edit_project_master(){
$no_pro = 'PRJ-2017-501'; //
$na_pro = $this->input->post('na_pro'); //value for edit
$ja_pro = $this->input->post('i_metode'); //value for edit 
$check_pro = $this->MProject->get_det_pro($no_pro); //get data form table
//checking script
foreach($check_pro as $res_check_pro){
 if($na_pro != $res_check_pro['NAMA_PROJECT']){ //IF VALUE DIFFERENT
 $col_name;
 foreach($res_check_pro as $key_pro => $val_pro){
 if($res_check_pro['NAMA_PROJECT'] == $val_pro){
 $col_name = $key_pro; //GET COLUMN NAME
 }
 }
 $data['ACTIVITY'] = "UPDATE";
 $data['OLD_VALUE'] = $res_check_pro['NAMA_PROJECT'];
 $data['NEW_VALUE'] = $na_pro;
 $data['COL_AFFECTED'] = $col_name;
 $data['TABLE_AFFECTED'] = "PM_REQUIREMENT_PROJECT"; //How to get table name automatically??
 $data['ANNOTATION'] = NULL;
 $data['EXECUTOR'] = $this->session->userdata('nip');
 $data['CHANGED_ON'] = date("Y-m-d H:i:s");
 $data['CHANGED_BY'] = $_SERVER['REMOTE_ADDR'];
 $data['STATUS'] = 1;
 $this->MProject->ins_system_log($data); 
 }
 if($ja_pro != $res_check_pro['JADWAL_PROJECT']){
 $col_name;
 foreach($res_check_pro as $key_pro => $val_pro){
 if($res_check_pro['JADWAL_PROJECT'] == $val_pro){
 $col_name = $key_pro;
 }
 }
 $data['ACTIVITY'] = "UPDATE";
 $data['OLD_VALUE'] = $res_check_pro['JADWAL_PROJECT'];
 $data['NEW_VALUE'] = $na_pro;
 $data['COL_AFFECTED'] = $col_name;
 $data['TABLE_AFFECTED'] = "PM_REQUIREMENT_PROJECT"; //How to get table name automatically??
 $data['ANNOTATION'] = NULL;
 $data['EXECUTOR'] = $this->session->userdata('nip');
 $data['CHANGED_ON'] = date("Y-m-d H:i:s");
 $data['CHANGED_BY'] = $_SERVER['REMOTE_ADDR'];
 $data['STATUS'] = 1;
 $this->MProject->ins_system_log($data); 
 }
}
}
Jamal
35.2k13 gold badges134 silver badges238 bronze badges
asked Nov 10, 2017 at 8:44
\$\endgroup\$

1 Answer 1

2
\$\begingroup\$

You can avoid repeating whole blocks of code by isolating the dynamic components of your function and assign them to an array. Then as you wish to modify the fields/columns to be checked, you merely need to update the array and not the functional/checking parts.

public function edit_project_master(){
 $no_pro = 'PRJ-2017-501';
 $check_pro = $this->MProject->get_det_pro($no_pro); //get data form table
 $checklist=[
 ['input'=>'na_pro','column'=>'NAMA_PROJECT','table'=>'PM_REQUIREMENT_PROJECT'],
 ['input'=>'i_metode','column'=>'JADWAL_PROJECT','table'=>'PM_REQUIREMENT_PROJECT']
 ];
 //checking script
 foreach($check_pro as $res_check_pro){
 foreach($checklist as $listrow){
 $pro = $this->input->post($listrow['input']); //value for edit
 if($pro != $res_check_pro[$listrow['column']]){ //IF VALUE DIFFERENT
 foreach($res_check_pro as $key_pro => $val_pro){
 if($res_check_pro[$listrow['column']] == $val_pro){
 $col_name = $key_pro; //GET COLUMN NAME
 break; // I assume you want to break as soon as you find a match
 }
 }
 $data['ACTIVITY'] = "UPDATE";
 $data['OLD_VALUE'] = $res_check_pro[$listrow['column']];
 $data['NEW_VALUE'] = $pro;
 $data['COL_AFFECTED'] = $col_name;
 $data['TABLE_AFFECTED'] = $listrow['table']; // I'm not sure how you mean "automatically", this is "dynamically"
 $data['ANNOTATION'] = NULL;
 $data['EXECUTOR'] = $this->session->userdata('nip');
 $data['CHANGED_ON'] = date("Y-m-d H:i:s");
 $data['CHANGED_BY'] = $_SERVER['REMOTE_ADDR'];
 $data['STATUS'] = 1;
 $this->MProject->ins_system_log($data);
 }
 }
 }
}

Also...

I added break; to the innermost foreach() assuming there will only be one match. This is best practice because it avoids doing pointless iterations.

I made the value for $data['TABLE_AFFECTED'] "dynamic" (modifiable via the $checklist array). I don't know if this is what you had in mind by "automatic".

answered Nov 12, 2017 at 7:22
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.