Member 12428521 Ответов: 1

Проблема с загрузкой продукта с несколькими изображениями


 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?


Что я уже пробовал:

Вот мой PHP код
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!
                </span>";

               } 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);

                       if($inserted_row){
                               $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;
                           }
                   }
           }
       }
   }


Вот моя страница формы
<?php 
		$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>
			 <?php
				  $getCategory = $category->getAllCat();
					if($getCategory){
					 while($result = $getCategory->fetch_assoc()){
			 ?>
				<option value="<?php echo $result['catId']; ?>"><?php echo $result['catName']; ?></option>
			 <?php } } ?>
		</select>                          
		
		<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>
		</select>  
                          
       <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>
	  </select>                          

	 <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>
		<?php
			$getRegion = $region->getAllRegion();
				 if($getRegion){
					 while($result = $getRegion->fetch_assoc()){
			?>
			 <option value="<?php echo $result['regionId']; ?>"><?php echo $result['regionName']; ?></option>
             <?php } } ?>
	 </select>                          

	<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>
	  </select>                          
	
        <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" />
      </div>
    </form>


А вот Javascript, который я использую для предварительного просмотра изображений
<script type="text/javascript">
	var count=0;
	function handleFileSelect(evt) {
		var $fileUpload = $("input#Photofile[type='file']");
		count=count+parseInt($fileUpload.get(0).files.length);
		
		if (parseInt($fileUpload.get(0).files.length) > 4 || count>3) {
			alert("You can only upload a maximum of 3 photos");
			count=count-parseInt($fileUpload.get(0).files.length);
			evt.preventDefault();
			evt.stopPropagation();
			return false;
		}
		var files = evt.target.files;
		for (var i = 0, f; f = files[i]; i++) {
			if (!f.type.match('image.*')) {
				continue;
			}
			var reader = new FileReader();

			reader.onload = (function (theFile) {
				return function (e) {
					var span = document.createElement('span');
					span.innerHTML = ['<img class="thumb mrm mts" src="', e.target.result, '" title="', escape(theFile.name), '"/><span class="remove_img_preview"></span>'].join('');
					document.getElementById('list').insertBefore(span, null);
				};
			})(f);

			reader.readAsDataURL(f);
		}
	}
	
	$('#Photofile').change(function(evt){
		handleFileSelect(evt);
	});	 

	$('#list').on('click', '.remove_img_preview',function () {
		$(this).parent('span').remove();
        
        //this is not working...
        var i = array.indexOf($(this));
        if(i != -1) {
            array.splice(i, 1);
        }
        // tried this too:
        //$(this).parent('span').splice( 1, 1 );
        
        count--;
	});
</script>

1 Ответов

Рейтинг:
2

Jochen Arndt

$unique_image = substr(md5(time()), 0, 10).'.'.$file_ext;
Ваши имена изображений, вероятно, не уникальны, потому что time() возвращает второе значение на основе (см. РНР: время - ручное[^]).

Вы также не должны усекать хэш MD5, потому что это также может привести к дубликатам.

Я предлагаю использовать РНР: tempnam - руководство пользователя[^] вместо.


Member 12428521

@Йохен О, я вижу. Так же как и формат $unique_image = substr(tempnam(), 0, 10).'.'.$file_ext;

Jochen Arndt

Нет. См. ссылку на документацию по PHP. Вы должны передать путь к каталогу (разрешенный полный путь для "../uploads"). Возвращаемая строка-это полный путь, который не должен быть сокращен с помощью функции substr().

Обратите внимание также, что возвращаемый путь не имеет расширения файла изображения. Вы можете добавить это, но это снова нарушит уникальность, потому что tempnam() гарантирует только то, что возвращаемое имя уникально. При этом вы также должны удалить возвращаемое имя файла, поскольку функция tempnam() уже создала файл с нулевым размером.