PHP изображение сбрасывается, когда я обновляю сообщение без нового изображения - PullRequest
0 голосов
/ 13 июля 2020

У меня есть форма для редактирования сообщения, которая включает загрузку изображения. Форма проходит проверку, существует ли файл изображения, является ли изображение разрешенными типами файлов, если изображение находится в параметрах размера изображения - если изображение проходит эти проверки, оно загружается и прикрепляется к сообщению. Проблема в том, что если я обновляю сообщение без обновления изображения, оно стирает ссылку на изображение в базе данных. Вот код и форма:

$posts = array(
    'title' => '',
    'category' => '',
    'image' => '',
    'post' => ''
);
// Check for submit
if(isset($_POST['submit'])) {
    // Get form data
    $update_id = $_POST['update_id'];
    $title     = $_POST['title'];
    $category      = $_POST['category'];
    $post    = $_POST['post'];

    $image        = $_FILES['image']['name'];
    $image_temp   = $_FILES['image']['tmp_name'];

    $target_dir = "uploads/";
    $target_file = $target_dir . basename($_FILES["image"]["name"]);
    $uploadOk = 1;
    $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

    // Check if image exists
    if (!(file_exists($_FILES['image']['tmp_name']))){
        // Update the post
        $stmt = $pdo->prepare('UPDATE posts SET title = ?, category = ?, post = ?, image = ?  WHERE id = ?');
        $stmt->execute([ $_POST['title'], $_POST['category'], $_POST['post'], $_FILES['image']['name'], $_GET['id'] ]);
        flash('post_updated', '<div>Post updated successfully.<button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span></button></div>', 'alert alert-success alert-dismissible fade show');
    } elseif (file_exists($target_file)) {
        flash('image_exists', '<div>Sorry, file already exists.<button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span></button></div>', 'alert alert-danger alert-dismissible fade show');
        $uploadOk = 0;
    } elseif ($_FILES["image"]["size"] > 500000) {
        flash('image_too_large', '<div>Sorry, your file is too large.<button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span></button></div>', 'alert alert-danger alert-dismissible fade show');
        $uploadOk = 0;
    } elseif($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
        && $imageFileType != "gif" ) {
        flash('filetype_not_allowed', '<div>Sorry, only JPG, JPEG, PNG & GIF files are allowed.<button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span></button></div>', 'alert alert-danger alert-dismissible fade show');
        $uploadOk = 0;
    } elseif ($uploadOk == 0) {
        echo "";
    } else {
        // if everything is ok, try to upload file
        if (move_uploaded_file($_FILES["image"]["tmp_name"], $target_file)) {
            flash('post_updated', '<div>The file '. basename( $_FILES["image"]["name"]). ' has been uploaded.<button type="button" class="close" data-dismiss="alert" aria-label="Close">
            <span aria-hidden="true">&times;</span></button></div>', 'alert alert-success alert-dismissible fade show');
            // Update the post
            $stmt = $pdo->prepare('UPDATE posts SET title = ?, category = ?, post = ?, image = ? WHERE id = ?');
            $stmt->execute([$_POST['title'], $_POST['category'], $_POST['post'], $_FILES['image']['name'], $_GET['id']]);
            flash('image_updated', '<div>Post updated successfully.<button type="button" class="close" data-dismiss="alert" aria-label="Close">
            <span aria-hidden="true">&times;</span></button></div>', 'alert alert-success alert-dismissible fade show');
        }
    }
}

<form action="<?php $_SERVER['PHP_SELF'] ?>" method="post" enctype="multipart/form-data">
    <div class="card">
        <div class="card-header">
            <h3 class="font-weight-light">Edit Post</h3>
        </div>
    <div class="card-body">
        <div class="form-group">
            <label for="title">Title</label>
            <input type="text" name="title" class="form-control" value="<?php echo $post->title; ?>" required>
        </div>
        <div class="form-group">
            <label for="author">Author</label>
            <input type="text" name="author" class="form-control" value="<?php echo $post->author; ?>" readonly>
        </div>
        <div class="form-group">
            <label for="category">Category </label>
            <select class="form-control" name="category" id="category">
                <option value="<?php echo $post->category; ?>"><?php echo $post->category; ?></option>
                <?php
                $sql = 'SELECT * FROM category';
                $stmt = $pdo->prepare($sql);
                $stmt->execute();
                $categories = $stmt->fetchAll();
                ?>
                <?php foreach ($categories as $category) : ?>
                    <option value="<?php echo $category->title; ?>"><?php echo $category->title; ?></option>
                <?php endforeach; ?>
            </select>
        </div>
        <?php echo "<img class='mb-4 mt-2' src='uploads/" . imagePlaceholder($post->image) . "'" . "width='400'>"; ?>
        <div class="form-group">
            <div class="custom-file">
                <input class="custom-file-input" type="file" name="image" id="image" value="<?php echo ($post->image); ?>">
                <label for="image" class="custom-file-label">Select Image</label>
            </div>
        </div>
        <div class="form-group">
            <label for="body">Post</label>
            <textarea name="post" class="form-control" rows="5" required><?php echo $post->post; ?></textarea>
        </div>
        <div class="form-group">
            <label for="datetime">Date Created</label>
            <input type="text" name="datetime" class="form-control" value="<?php echo $post->datetime; ?>" readonly>
        </div>
        <div class="row">
            <div class="col-lg-6 mb-2">
                <input type="hidden" name="update_id" value="<?php echo $post->id; ?>">
                <button class="btn btn-block btn-success font-weight-light" type="submit" name="submit">Update</button>
            </div>
            <div class="col-lg-6 mb-2">
                <a class="btn btn-block btn-primary float-right font-weight-light" href="dashboard.php">Dashboard</a>
            </div>
        </div>
    </div>
</form>

Я попытался добавить приведенный ниже код для обновления базы данных без перезаписи имени изображения в базе данных, но это не сработало.

if(empty($_FILES['image']['name'])) {
    $stmt = $pdo->prepare('UPDATE posts SET title = ?, category = ?, post = ? WHERE id = ?');
    $stmt->execute([$_POST['title'], $_POST['category'], $_POST['post'], $_GET['id']]);
    flash('image_updated', '<div>Post updated successfully.<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button></div>', 'alert alert-success alert-dismissible fade show');
} elseif (move_uploaded_file($_FILES["image"]["tmp_name"], $target_file)) {
flash('post_updated', '<div>The file '. basename( $_FILES["image"]["name"]). ' has been uploaded.<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button></div>', 'alert alert-success alert-dismissible fade show');
     // Update the post
    $stmt = $pdo->prepare('UPDATE posts SET title = ?, category = ?, post = ?, image = ? WHERE id = ?');
    $stmt->execute([$_POST['title'], $_POST['category'], $_POST['post'], $_FILES['image']['name'], $_GET['id']]);
    flash('image_updated', '<div>Post updated successfully.<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button></div>', 'alert alert-success alert-dismissible fade show');
        }

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

...