Bootstrap 5 https://getbootstrap.com/docs/5.1/getting-started/download/
index.php
//index.php
<!DOCTYPE html>
<html lang="en">
<head>
<title>PHP and MySQL Upload Image</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"></script>
<style>
.image-preview {
background-image: url('avatar.png');
width: 14%;
height: 100px;
background-size: cover;
background-position: center;
border-radius: 10px;
}
.photo {
width: 50px;
height: 50px;
border-radius: 50%;
}
</style>
</head>
<body>
<?php
include "dbcon.php";
$sql = "select * from users order by name";
$stmt = $conn->prepare($sql);
$stmt->execute();
$result = $stmt->get_result();
include "upload.php";
?>
<div class="container">
<h1 class="mb-5">PHP and MySQL Upload Image</h1>
<div class="table-responsive">
<h2>List of users</h2>
<a class="btn btn-primary" href="#" data-bs-toggle="modal" data-bs-target="#modalAddnew">Add New</a>
<table class="mt-5 table table-bordered table-striped">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Name</th>
<th scope="col">Photo</th>
<th scope="col">Action</th>
</tr>
</thead>
<tbody>
<?php
if ($result->num_rows > 0) {
$counter = 0;
foreach ($result as $row) {
$counter++;
?>
<tr class="">
<td scope="row"><?= $counter ?></td>
<td><?= $row['name'] ?></td>
<td><img class="photo" src="uploads/<?= $row['photo'] ?>"></td>
<td>
<a href="index.php?id=<?= $row['id'] ?>" onclick="return confirm('Are you sure you want to delete the user?')">
<button type="button" class="btn btn-danger" title="delete the user">
Delete
</button>
</a>
</td>
</tr>
<?php }
} else { ?>
<tr>
<td>No users to display</td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
</div>
<!-- Modal -->
<div class="modal fade" id="modalAddnew" tabindex="-1" role="dialog" aria-labelledby="modalTitleId" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalTitleId">
Add New
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form action="" method="post" enctype="multipart/form-data">
<div class="mb-3">
<label for="name" class="form-label">Name</label>
<input type="text" class="form-control" name="name" id="name" aria-describedby="helpId" placeholder="Enter a Name" />
<div class="text-danger"><?= $name_err ?></div>
</div>
<div class="mb-3">
<label for="photo" class="form-label">Select A Photo</label>
<input type="file" class="form-control" name="photo" id="photo" placeholder="" aria-describedby="fileHelpId" onchange="previewImg(this)" />
<div id="fileHelpId" class="form-text">Allowed file types: jpg, jpeg, png</div>
<div class="text-danger"><?= $photo_err ?></div>
</div>
<div class="mb-5 image-preview"></div>
<button type="submit" name="submit" class="btn btn-primary">
Submit
</button>
</form>
<div class="text-danger"><?= $err_msg ?></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
Close
</button>
</div>
</div>
</div>
</div>
<script>
function previewImg(input) {
if (input.files && input.files[0] != "") {
var reader = new FileReader();
reader.onload = function(e) {
$(".image-preview").css('background-image', 'url(' + e.target.result + ')');
}
reader.readAsDataURL(input.files[0]);
}
}
</script>
</body>
</html>
dbcon.php
//dbcon.php
<?php
$server = "localhost";
$uid = "root";
$pwd = "root";
$dbname = "devproject";
$conn = new mysqli($server, $uid, $pwd, $dbname);
if ($conn->connect_error)
die("database connection error " . $conn->connect_error);
upload.php
// upload.php
<?php
$error = false;
$name_err = $photo_err = $err_msg = "";
$valid_ext = array('jpg', 'jpeg', 'png');
$target_dir = "uploads/";
$photo = "";
if (isset($_REQUEST['id']) && $_REQUEST['id'] != "") {
// delete image
$id = $_REQUEST['id'];
$sql = "select photo from users where id=?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows == 1) {
$row = $result->fetch_assoc();
$photo = $row['photo'];
}
if (file_exists($target_dir . $photo))
unlink($target_dir . $photo);
$sql = "delete from users where id=?";
$stmt->prepare($sql);
$stmt->bind_param('i', $id);
$stmt->execute();
header("location:index.php");
}
if(isset($_POST['submit'])){
$name = $_POST['name'];
if ($name ==""){
$name_err = "Please enter the name";
$error = true;
}
if($_FILES['photo']['name'] ==""){
$photo_err = "Please select a photo";
$error = true;
}
if (!$error){
$image_name = $_FILES['photo']['name'];
$image_tmp = $_FILES['photo']['tmp_name'];
$image_size = $_FILES['photo']['size'];
// check for extension
$ext = strtolower(pathinfo($image_name, PATHINFO_EXTENSION));
if (in_array($ext, $valid_ext)) {
// valid extension
if (exif_imagetype($image_tmp) == IMAGETYPE_JPEG || exif_imagetype($image_tmp) == IMAGETYPE_PNG) {
// valid image
if ($image_size > 4000000) {
// exceeds 4M
$err_msg = "image size exceeds 4M";
} else {
// upload
$new_image = time() . "-" . basename($image_name);
try {
move_uploaded_file($image_tmp, $target_dir . $new_image);
// insert
try {
$sql = "insert into users (name, photo) values (?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ss", $name, $new_image);
$stmt->execute();
header("location:index.php");
} catch (Exception $e) {
$err_msg = $e->getMessage();
}
} catch (Exception $e) {
$err_msg = $e->getMessage();
}
}
} else {
$err_msg = "Not a valid image file";
}
} else {
$err_msg = "Not a valid extension";
}
}
}
Github - PHP and MySQL Upload Image
