Как обновить базу данных со старым изображением и без выбора нового изображения? - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь редактировать сотрудников.Я удаляю старый файл, если новый файл загружен с новой формой имени.Это работает хорошо, за исключением обновления старого изображения.Я просмотрел несколько уроков и примеров из вопросов о 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 голосов
/ 08 декабря 2018

Что не так:

Когда вы НЕ загружаете новый файл, вы все равно запускаете

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

Я предполагаю, что generatenewstring(12) генерирует строкус 12 случайными символами, поэтому $image_file ВСЕГДА уступит истинному значению, поэтому всегда выполняйте оператор 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...