Home > Back-end >  multiple images in php foreach getting saved all together in different rows in codeigniter
multiple images in php foreach getting saved all together in different rows in codeigniter

Time:02-08

i have a codeigniter website , which has a form which allows user to upload some data multiple times,

my view is like below:

 <input type="text" name="pname[]">
  <input type="file" name="pimage[]" multiple="multiple">
  
  <input type="text" name="pname[]" >
  <input type="file" name="pimage[]" multiple="multiple">

and my controller is like:

 if(isset($_POST['addproduct']))
                                  {
foreach($this->input->post('pname') as $row =>$value)  {

  $this->load->library('upload');
  $image = array();
  $ImageCount = count($_FILES['pimage']['name']);
  for($i = 0; $i < $ImageCount; $i  ){
  $_FILES['file']['name']       = $_FILES['pimage']['name'][$i];
  $_FILES['file']['type']       = $_FILES['pimage']['type'][$i];
  $_FILES['file']['tmp_name']   = $_FILES['pimage']['tmp_name'][$i];
  $_FILES['file']['error']      = $_FILES['pimage']['error'][$i];
  $_FILES['file']['size']       = $_FILES['pimage']['size'][$i];

  $uploadPath = './uploads/products/';
  $config['upload_path'] = $uploadPath;
  $config['allowed_types'] = 'jpg|jpeg|png|gif';

  $this->load->library('upload', $config);
  $this->upload->initialize($config);

  if($this->upload->do_upload('file')){
  $imageData = $this->upload->data();
   $uploadImgData[] = $imageData['file_name'];

  }
  }
$pname = $this->input->post('pname')[$row];
$pimage = $uploadImgData;
                                        
 $insertUserData = $this->category->addbulkproducts($pname,$pimage)
       }

here the issue is with the image, if i upload 2images for first product and 2 images for 2nd product, all 4 images are getting uploaded 2 times and all those images are getting saved in both the product row, see my table below

enter image description here

can anyone please tell me what went wrong here, thanks in advance

CodePudding user response:

You have two duplicated input, just delete one:

<input type="text" name="pname[]">
<input type="file" name="pimage[]" multiple="multiple">
  

If you want to add multiple data just change their names:

<input type="text" name="pname[]">
<input type="file" name="pimage0[]" multiple="multiple">

<input type="text" name="pname[]">
<input type="file" name="pimage1[]" multiple="multiple">

And remember to update in your controller:

if (isset($_POST['addproduct'])) {
            foreach ($this->input->post('pname') as $row => $value) {
                $file_input_name = 'pimage' . $row;
                $uploadImgData = [];
                if (isset($_FILES[$file_input_name])) {

                    $ImageCount = count($_FILES[$file_input_name]['name']);
                    for ($i = 0; $i < $ImageCount; $i  ) {
                        $_FILES['file']['name'] = $_FILES[$file_input_name]['name'][$i];
                        $_FILES['file']['type'] = $_FILES[$file_input_name]['type'][$i];
                        $_FILES['file']['tmp_name'] = $_FILES[$file_input_name]['tmp_name'][$i];
                        $_FILES['file']['error'] = $_FILES[$file_input_name]['error'][$i];
                        $_FILES['file']['size'] = $_FILES[$file_input_name]['size'][$i];
                    }
                    $uploadPath = './uploads/products/';
                    $config['upload_path'] = $uploadPath;
                    $config['allowed_types'] = 'jpg|jpeg|png|gif';
                    $this->load->library('upload', $config);
                    $this->upload->initialize($config);

                    if ($this->upload->do_upload('file')) {
                        $imageData = $this->upload->data();
                        $uploadImgData[] = $imageData['file_name'];
                    }
                }

                $pname = $this->input->post('pname')[$row];
                $pimage = $uploadImgData;

                $insertUserData = $this->category->addbulkproducts($pname, $pimage);
            }
        }

Update the script to add more products:

<script>
  var loop_count = 1;

  function add_more() {
    loop_count  ;

    var html = '<div  id="product_attr_'   loop_count   '">';



    html  = '<div ><label for="inputEmail4">Product Name</label><input type="text" name="pname[]"  id="inputEmail4"></div><div ><label for="inputEmail4">Product Price</label><input type="text" name="pprice[]"  id="inputEmail4"></div><div ><label for="inputEmail4">Offer Price</label><input type="text" name="offerprice[]"  id="inputEmail4"></div><div ><label for="inputEmail4">Brand Name</label><input type="text" name="brandname[]"  id="inputEmail4"></div><div ><label for="inputEmail4">PIN Codes</label><textarea name="pincode[]"  id="exampleFormControlTextarea1" placeholder="500028, 500056, etc" rows="3"></textarea></div><div ><label for="inputEmail4">XS</label><input type="text" name="xssize[]" placeholder="Stock"  id="inputEmail4"></div><div ><label for="inputEmail4">S</label><input type="text" name="ssize[]"  placeholder="Stock" id="inputEmail4"></div><div ><label for="inputEmail4">M</label><input type="text" name="msize[]"  placeholder="Stock" id="inputEmail4"></div><div ><label for="inputEmail4">L</label><input type="text" name="lsize[]"  placeholder="Stock" id="inputEmail4"></div><div ><label for="inputEmail4">XL</label><input type="text" name="xlsize[]"  placeholder="Stock" id="inputEmail4"></div><div ><label for="inputEmail4">XXL</label><input type="text" name="xxlsize[]"  placeholder="Stock" id="inputEmail4"></div><div ><label for="inputEmail4">3XL</label><input type="text" name="3xlsize[]"  placeholder="Stock" id="inputEmail4"></div><div ><label for="inputEmail4">Description</label><input type="text" name="description[]"  placeholder="Description" id="inputEmail4"></div><div ><label for="inputEmail4">Material</label><input type="text" name="material[]"  placeholder="Material" id="inputEmail4"></div><div ><label for="inputEmail4">SKU</label><input type="text" name="sku[]"  placeholder="SKU" id="inputEmail4"></div><div ><label for="inputEmail4">Product Image</label><input type="file" id="myfile"  name="pimage'   (loop_count - 1)   '[]" multiple="multiple"></div><div ><label for="inputPassword4">Status</label><select  name="status[]" aria-label="Default select example"><option value="Active">Active</option><option value="Inactive">Inactive</option></select></div>';

    html  = '<div > <label <button type="button"  onclick=remove_more("'   loop_count   '")>REMOVE </button></div>';


    jQuery('#product_attr_box').append(html)
  }

  function remove_more(loop_count) {
    jQuery('#product_attr_'   loop_count).remove();
  }
</script>
  •  Tags:  
  • Related