2013-02-06 32 views
1

我打算一次上传多个图像到一个文件夹中,并将其信息保存到数据库中。使用pdo在php中上传多个图像

无论我选择一个还是多个,它都能正确上传这些图像到文件夹中。但是,当我选择很多时,它不会将图像的信息存储到数据库中,而只会将图像上传到文件夹中。如果我选择一个图像,那么它会将该图像的信息正确存储到数据库中。

以下是我的代码。

<?php 
#connect to the db 
require_once('db.inc.php'); 
?> 
<html> 
<head> 
</head> 
<body> 
<form action="" method="POST" enctype="multipart/form-data"> 
    <input type="file" name="files[]" multiple/> 
    <input type="submit"/> 
</form> 
<?php 
if(isset($_FILES['files'])){ 
    $errors= array(); 
    foreach($_FILES['files']['tmp_name'] as $key => $tmp_name){ 
     $file_name = $key.$_FILES['files']['name'][$key]; 
     $file_size =$_FILES['files']['size'][$key]; 
     $file_tmp =$_FILES['files']['tmp_name'][$key]; 
     $file_type=$_FILES['files']['type'][$key]; 
     if($file_size > 2097152){ 
      $errors[]='File size must be less than 2 MB'; 
     }try{  
$query ="INSERT into tish_images(FILE_NAME,FILE_SIZE,FILE_TYPE) 
VALUES(:FILE_NAME,:FILE_SIZE,:FILE_TYPE)"; 
$insert = $con->prepare($query); 
$insert->execute(array(
':FILE_NAME'=>$file_name, 
':FILE_SIZE'=>$file_size, 
':FILE_TYPE'=>$file_type)); 
}catch(PDOException $e){ 
echo $e->getMessage(); 
} 
$desired_dir="image_uploads"; 
     if(empty($errors)==true){ 
      if(is_dir($desired_dir)==false){ 
       mkdir("$desired_dir", 0700);// Create directory if it does not exist 
      } 
      if(is_dir("$desired_dir/".$file_name)==false){ 
       move_uploaded_file($file_tmp,"image_uploads/".$file_name); 
      }else{         //rename the file if another one exist 
       $new_dir="image_uploads/".$file_name.time(); 
       rename($file_tmp,$new_dir) ;    
      } 


     }else{ 
       print_r($errors); 
     } 
    } 
    if(empty($error)){ 
     echo "Success"; 
    } 
} 
?> 

</body> 
</html> 
+0

@DMK感谢您的编辑 – humphrey

回答

7
<?php 
if(isset($_FILES['files'])){ 
    $query = "INSERT into tish_images(`FILE_NAME`,`FILE_SIZE`,`FILE_TYPE`) 
      VALUES(:FILE_NAME,:FILE_SIZE,:FILE_TYPE)"; 
    $stmt = $con->prepare($query); 
    $errors= array(); 
    foreach($_FILES['files']['tmp_name'] as $key => $error){ 
     if ($error != UPLOAD_ERR_OK) { 
      $errors[] = $_FILES['files']['name'][$key] . ' was not uploaded.'; 
      continue; 
     } 
     $file_name = $key.$_FILES['files']['name'][$key]; 
     $file_size = $_FILES['files']['size'][$key]; 
     $file_tmp = $_FILES['files']['tmp_name'][$key]; 
     $file_type = $_FILES['files']['type'][$key]; 
     if($file_size > 2097152){ 
      $errors[] = 'File size must be less than 2 MB'; 
      continue; 
     } 
     try{  
      $stmt->bindParam(':FILE_NAME', $file_name , PDO::PARAM_STR); 
      $stmt->bindParam(':FILE_SIZE', $file_size, PDO::PARAM_STR); 
      $stmt->bindParam(':FILE_TYPE', $file_type, PDO::PARAM_STR); 
      $stmt->execute(); 

      $desired_dir="image_uploads"; 

      if(is_dir($desired_dir)==false){ 
       mkdir($desired_dir, 0700);// Create directory if it does not exist 
      } 
      if(is_file($desired_dir.'/'.$file_name)==false){ 
       move_uploaded_file($file_tmp,$desired_dir.'/'.$file_name); 
      }else{ //rename the file if another one exist 
       $new_file=$desired_dir.'/'.$file_name.time(); 
       move_uploaded_file($file_tmp,$new_file) ;    
      } 
     }catch(PDOException $e){ 
      $errors[] = $file_name . 'not saved in db.'; 
      echo $e->getMessage(); 
     } 
    } 
    if(empty($error)){ 
     echo "Success"; 
    } 
} 
?> 

我看不出有太多错误的,但我已经重构了代码周围PDO一点,所以它更具可读性,你现在才准备一次。我已经在try块中移动了实际的移动文件,所以你只会尝试在db执行时没有错误(你应该检查插入的状态 - 查看$ stmt-> errorCode()或$ stmt-> errorInfo() )。

+0

是的你修好了我欣赏你的帮助,现在我想要的是让这些图像分配给上传他们的人。例如伊恩你登录并上传这些图像。当你再次登录时,你将能够单独查看,而不是另一个用户?什么是前进方向或想法 – humphrey

+0

@humphrey - 最好的做法是尝试编写代码,将图像分配给用户自己。如果您遇到问题,请使用迄今为止已尝试的方法发布另一个问题。 – DMK

+1

@humphrey - 另外,如果伊恩的帖子解决了你的初始问题,那么你应该接受它作为正确的答案,通过选择他的回应'滴答':)欢迎来到堆栈溢出 – DMK