2016-08-02 3 views
2

Я делаю создание динамической галереи изображений с помощью PHP, все мои CRUD функционируют должным образом, за исключением случаев, когда я обновляю данные изображения (заголовок &) если новый файл изображения i не выбран, старый файл все еще удаляется. PHP код выглядит следующим образом:галерея изображений CRUD - функция обновления удаляет существующий файл, даже если замена не выбрана

$id = null; 
if(!empty($_GET['id'])){ 
    $id = $_REQUEST['id']; 
} 

if(null == $id){ 
    header("location: galleryadmin.php"); 
} 

if (!empty($_POST)){ 
    $uploader = new Uploader(); 

    //keep track of validation errors 
    $titleError = null; 
    $descriptionError = null; 
    $imageError = null; 

    //track post values 
    $title = $_POST['title']; 
    $description = $_POST['description']; 
    $image = $_POST['image']; 

    //validating inputs 
    $valid = true; 

    if(empty($title)){ 
     $titleError = 'Please add a title'; 
     $valid = false; 
    } 

    if(empty($description)){ 
     $descriptionError = 'Please add a description'; 
     $valid = false; 
    } 

    if (!empty($_FILES['image']['title']) && !$uploader->valid($_FILES['image'])){ 
     $imageError = 'Invalid file uploaded'; 
     $valid = false; 
    } 

    //update data 
    if($valid){ 

     if (!empty($image)){ 
      $uploader->delete($image); 
     } 

     $image = $uploader->upload($_FILES['image']); 

     $pdo = Database::connect(); 
     $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 
     $sql = "UPDATE gallery set title = ?, description = ?, image = ? WHERE id = ?"; 
     $q = $pdo->prepare($sql); 
     $q->execute(array($title,$description,$image,$id)); 
     Database::disconnect(); 
     header("location: galleryadmin.php"); 
    } 

} else { 
    $pdo = Database::connect(); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 
    $sql = "SELECT * FROM gallery WHERE id = ?"; 
    $q = $pdo->prepare($sql); 
    $q->execute(array($id)); 
    $data = $q->fetch(PDO::FETCH_ASSOC); 
    $title = $data['title']; 
    $description = $data['description']; 
    $image = $data['image']; 
    Database::disconnect(); 
} 

ответ

0

Если элемент формы называется "image" имеет тип "file", то вы не можете получить доступ к нему с $_POST['image'] - вы можете получить доступ к нему только через $_FILES['image'] Так чеке

if (!empty($image)){ 

неправильный. Вместо этого используйте это

if(is_array($_FILES) AND count($_FILES['image'])!=0 AND $_FILES['image']['error']==UPLOAD_ERR_OK) 
+0

«image» не хранит сам файл, просто путь к изображению, это что-то меняет? – eschift

+0

Я не уверен, что правильно понимаю ваш последний комментарий. Когда вы смотрите на веб-форму на экране - да, элемент формы типа '' file "' выглядит как элементы формы типа '" text "и показывает локальный путь к файлу, который будет загружен. Но когда сервер получает форму, на самом деле он содержит как имя, так и содержимое файла. Таким образом, '$ _POST ['image']' всегда будет пустым, независимо от того, был ли файл или не был загружен - потому что это не обычный элемент формы, а файл. Доступ к файлам осуществляется с помощью супер-глобального '$ _FILES'. –