У меня есть форма для редактирования сообщения, которая включает загрузку изображения. Форма проходит проверку, существует ли файл изображения, является ли изображение разрешенными типами файлов, если изображение находится в параметрах размера изображения - если изображение проходит эти проверки, оно загружается и прикрепляется к сообщению. Проблема в том, что если я обновляю сообщение без обновления изображения, оно стирает ссылку на изображение в базе данных. Вот код и форма:
$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">×</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">×</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">×</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">×</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">×</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">×</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">×</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">×</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">×</span></button></div>', 'alert alert-success alert-dismissible fade show');
}
Я ищу, если имя изображения существует в базе данных, не перезаписывайте его. Я знаю, что существует разница в том, существует ли физически файл в папке загрузок, и есть ли имя файла в базе данных - просто пытаюсь понять, как заставить поток работать.