Search code examples
phpsqlfilecodeignitercodeigniter-3

multiple images in php foreach getting saved all together in different rows in codeigniter


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


Solution

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