如何用旧映像而不选择新映像来更新数据库?

时间:2018-12-07 08:41:24

标签: php mysqli pdo

我正在尝试编辑员工。如果以新名称形式上传新文件,我将删除旧文件。除使用旧图像进行更新外,此方法效果很好。 我看了一些有关Stackoverflow问题的教程和示例,但是它们不能解决我的问题。

我的问题是:

如果用户想保留旧图像,如何使用现有图像更新行  图片?

这是我的更新页面:

    // This part select old image
 try{
  $id = $_REQUEST['update_id']; 
  $select_stmt = $pdo->prepare('SELECT * FROM employees WHERE id =:id'); 
  $select_stmt->bindParam(':id',$id);
  $select_stmt->execute(); 
  $row = $select_stmt->fetch(PDO::FETCH_ASSOC);
  extract($row);
 }catch(PDOException $e){
  $e->getMessage();
 }

}

if(isset($_REQUEST['btn_update'])){
 try{
  $name = $_REQUEST['name'];
  $address = $_REQUEST['address'];
  $salary = $_REQUEST['salary'];

    // This part giving new name to image and validation.
  $image_file = generatenewstring(12).$_FILES["image"]["name"];
  $type  = $_FILES["image"]["type"]; 
  $size  = $_FILES["image"]["size"];
  $temp  = $_FILES["image"]["tmp_name"];

  $path="../images/ilanlar/".$image_file; 

  $directory="../images/ilanlar/"; 

  if($image_file){
   if($type=="image/jpg" || $type=='image/jpeg' || $type=='image/png' || $type=='image/gif'){ 
    // Checking for image if exist we will delete this statment later on
    if(!file_exists($path)){
     if($size < 1000000){
    // deleting old image
      unlink($directory.$row['image']); 
    // uploading new image
      move_uploaded_file($temp, "../images/ilanlar/" .$image_file); 
     }else{
      $errorMsg = "Your File To large Please Upload 5MB Size";
     }
    }else{ 
     $errorMsg = "File Already Exists...Check Upload Folder";
    }
   }else{
    $errorMsg = "Upload JPG, JPEG, PNG & GIF File Formate.....CHECK FILE EXTENSION";
   }
  }else{
   $image_file = $row['image']; 
  }

  if(!isset($errorMsg)){
   $stmt=$pdo->prepare('UPDATE employees SET 
                    name=:name, address=:address, salary=:salary, image=:image 
                    WHERE id=:id'); 
   $stmt->bindParam(':name',$name);
   $stmt->bindParam(':address',$address); 
   $stmt->bindParam(':salary',$salary);
   $stmt->bindParam(':image',$image_file);
   $stmt->bindParam(':id',$id);
    //bind all parameters
   if($stmt->execute()){
    echo "File Update Successfully......."; 
    header("refresh:3;3.php"); 
   }
  }
 }catch(PDOException $e){
  echo $e->getMessage();
 }

}

感谢您的帮助。

我尝试的代码太长,每次都必须执行一个新查询:

if ($image == 0) {
 //query1
} else if ($image == 1) {
 //query2
} else {
 //query3
}

1 个答案:

答案 0 :(得分:0)

出了什么问题:

当您不上传新文件时,您仍然可以运行

$image_file = generatenewstring(12).$_FILES["image"]["name"];
// snip
if ($image_file) {
    // Processing image & error handling
}

我假设generatenewstring(12)生成一个包含12个随机字符的字符串,所以$image_file总是会屈服为true,因此始终执行if语句。

您的类型检查将失败,因此$errorMsg将设置为"Upload JPG, [snip]"。因此

if(!isset($errorMsg)) { 
    // Update-statement
}

不会被执行。

解决方案:

if ($image_file)更改为if(is_uploaded_file($_FILES["image"]["tmp_name"]))。在这种情况下,当您不上传任何内容时将不会执行整个块,因此不会设置$errorMsg

您可能也不想:

1)移动一些代码(不上传时不需要整个块)

if(is_uploaded_file($_FILES["image"]["tmp_name"])) {
    $image_file = ...
    $type = ...
    // [snip]
    $directory = ...

    if ($type == "image/jpg") {
    }
} else {
    $image_file = $row['image'];
}

2)在某处回显您的$errorMsg;)

3)您可以将COALESCE留在注释之外,您已经通过将$image_file设置为else语句中的当前值来解决该问题。