I am new to PHP and MySQL and I will really need some assistance. Whenever I fill in all the information and submit my form, It successfully adds all information to the database. But the only issue is at the level of the images. When I upload two or more images, it only adds one image to the database and my upload file.

Any Idea on what's wrong?


public function adInsert($data, $file){
      $title = mysqli_real_escape_string($this->db->link, $data['title']);
       $catId = mysqli_real_escape_string($this->db->link, $data['catId']);
       $subcatId = mysqli_real_escape_string($this->db->link, $data['subcatId']);
       $priceformat = mysqli_real_escape_string($this->db->link, $data['priceformat']);
       $price = mysqli_real_escape_string($this->db->link, $data['price']);
       $regionId = mysqli_real_escape_string($this->db->link, $data['regionId']);
       $state = mysqli_real_escape_string($this->db->link, $data['state']);
       $description = mysqli_real_escape_string($this->db->link, $data['description']);

       if(count($file['images']['name']) > 0){
           for ($i = 0; $i < count($file['images']['name']); $i++) {//loop to get individual element from the array

               $permited  = array('jpg', 'jpeg', 'png', 'gif');
               $file_name = $file['images']['name'][$i];
               $file_size = $file['images']['size'][$i];
               $file_temp = $file['images']['tmp_name'][$i];

               $div = explode('.', $file_name);
               $file_ext = strtolower(end($div));
               $unique_image = substr(md5(time()), 0, 10).'.'.$file_ext;
               $uploaded_image = "../uploads/".$unique_image;

               if($title == "" || $catId == "" || $subcatId == "" || $priceformat == "" || $price == ""  || $regionId == "" || $file_name == "" || $state == "" || $description == ""){
                   $msg = "<span class='error'>Fields must not be empty!</span>";
                   return $msg;

               } elseif ($file_size >1048567) {
                    echo "<span class='error'>Image Size should be less then 1MB!

               } elseif (in_array($file_ext, $permited) === false) {
                   echo "<span class='error'>You can upload only:-".implode(', ', $permited)."</span>";

               } else{
                   move_uploaded_file($file_temp, $uploaded_image);
                   $query = "INSERT INTO ads(title, catId, subcatId, priceformat, price, regionId, images, state, description) VALUES('$title','$catId','$subcatId', '$priceformat', '$price','$regionId', '$uploaded_image', '$state', '$description')";
                   $inserted_row = $this->db->insert($query);

                               $msg = "<span class='success'> Your ad has been uploaded successfully. </span>";
                               return $msg;
                           } else{
                               $msg = "<span class='error'> Sorry! Your offer is not added! Try again later. </span>";
                               return $msg;

        $ad = new Ad();
        if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['create'])){
        $insertAd = $ad->adInsert($_POST, $_FILES);


<form action="" method="post" class="ad-form"  enctype="multipart/form-data" data-parsley-validate >
         <div class="form-fields-content">
         <label for="title">Title</label>                    
         <input type="text" id="title" name="title" placeholder="Title" required="required" data-parsley-maxlength="100" data-parsley-maxlength-message="Title can't have more than 100 words." data-parsley-required-message="Please enter a title." data-trigger="focus" data-toggle="popover" data-content="Keep the title short and clear. Do not write the price in it or any information that is not relevant." data-parsley-trigger="blur"/> 

          <label for="category">Category</label>  
         <select id="Category" name="catId" required="required" data-parsley-required-message="Please select a Category." data-parsley-trigger="change">
           <option value="">Select Category</option>
                  $getCategory = $category->getAllCat();
                     while($result = $getCategory->fetch_assoc()){
                <option value="<?php echo $result['catId']; ?>"><?php echo $result['catName']; ?></option>
             <?php } } ?>

        <label for="subcategory">Subcategory</label>                           
        <select id="Subcategory" name="subcatId" required="required" data-parsley-required-message="Please select a subcategory." data-parsley-trigger="change">
          <option value="">Select Category first</option>

       <label for="priceformat">Price Format</label>                        
       <select id="PriceFormat" onchange="change()" name="priceformat" required="required" data-parsley-required-message="Please Select Price Format." data-parsley-trigger="change">
        <option value="">Select Price Format</option>
        <option value="Fixed">Fixed Price</option>
        <option value="Negotiable">Negotiable</option>

     <label for="title">Price</label>                    
     <input type="text" name="price" placeholder="FCFA" required="required" pattern="[0-9]*" data-parsley-type="integer" data-parsley-type-message= "Enter the amount in digits. Decimals are not accepted." data-sanitize="integer" data-js-attr="{"type":"number","step":"any","min":"0"}" data-parsley-min="0" data-parsley-required-message="Please enter the price." data-parsley-trigger="blur" /> 

     <label for="region">Location | Region</label>                        
     <select id="Region" name="regionId" required="required" data-parsley-required-message="Please Select a Region." data-parsley-trigger="change">
     <option value="">Select Region</option>
            $getRegion = $region->getAllRegion();
                     while($result = $getRegion->fetch_assoc()){
             <option value="<?php echo $result['regionId']; ?>"><?php echo $result['regionName']; ?></option>
             <?php } } ?>

    <label for="images[]">Images*</label>                   
    <input type="file" id="Photofile" name="images[]" required="required" data-parsley-required-message="Please Upload at least one photo" multiple />

       <label for="condition">Condition</label>                                                                 
       <select id="Condition" onchange="change()" name="condition" required="required" data-parsley-required-message="Please Select Product condition." data-parsley-trigger="change">
       <option value="">Select Condition</option>
       <option value="New">New</option>
       <option value="Used">Used</option>

        <label for="content">Description</label> 
        <textarea id="content" rows="10" name="description" required="required" data-parsley-minlength="10" data-parsley-maxlength="8000" data-parsley-minlength-message="Content can't have less than 9 characters." data-parsley-maxlength-message="Content can't have more than 8000 characters." data-parsley-required-message="Please enter a description." data-toggle="popover" data-content="Give a detailed description of your item. Do not put your contact details (phone, email or website url) in the description." data-parsley-trigger="blur" ></textarea>       
      <input type="submit" name="create" value="Create Post" class="button" />
1 Month
Discussion Span
Last Post by ryantroop

So first, you have no reason to check the length of the files uploaded other than if it's greater than 0.. and even then ... meh. Let the logical loop do the work for you.

In the process of doing this, you will notice immediately that your single file upload process is incredibly different than your multi-file upload. This is, in my experience, poor code design (and poor logical design). The first rule that most programmers pick up on and figure out quick is "Don't Repeat Yourself" (many will call it the DRY principle). It is problems like your that make this very evident - if both paths went through the same function, you would know quickly if it is working or not; and you would not be updating mutliple logical paths that do the same exact thing.

TL;DR: Refactor your code to something like this:

for ($i = 0; $i < count($file['images']['name']); $i++) {//loop to get individual element from the array
   someFunctionThatProcessesYourInput($file['images'][$i]); // do the move_file and sql update and validation stuff in here...


This should catch all cases except there not being any files at all, in which case you probably want to skip it anyway :-P

I hope that helps!

Good luck!

Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.