How to develop Projects Using PHP and Mysql
Part 10
2️⃣ Blood Donation Management System
Module 2: Requester Management
Purpose:
Handles registration and management of blood requesters, including their personal details and blood request information.
Functionalities:
✅ Register blood requesters with name, email, contact, blood group needed, and reason
✅ View list of all blood requesters
✅ Edit or update requester details
✅ Delete requester records if required
Project Structure:
/requesters/
├── register.php # Register a new requester
├── edit_requester.php # Edit existing requester details
├── delete_requester.php # Delete a requester
├── requester_list.php # Display list of all requesters
Database Table:
CREATE TABLE requesters (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
blood_group ENUM('A+', 'A-', 'B+', 'B-', 'O+', 'O-', 'AB+', 'AB-') NOT NULL,
contact VARCHAR(15),
reason TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
✅ register.php – Register a New Blood
Requester
<?php
// Start session if
needed
session_start();
// Include your DB
connection file
include '../config/db_connect.php';
// Initialize variables
$name = $email = $contact
= $blood_group = $reason = "";
$errors = [];
$success_message = "";
// Handle form submission
if ($_SERVER["REQUEST_METHOD"]
== "POST") {
// Sanitize inputs
$name = trim(mysqli_real_escape_string($conn,
$_POST['name']));
$email = trim(mysqli_real_escape_string($conn,
$_POST['email']));
$contact = trim(mysqli_real_escape_string($conn,
$_POST['contact']));
$blood_group = $_POST['blood_group'];
$reason = trim(mysqli_real_escape_string($conn,
$_POST['reason']));
// Validate fields
if (empty($name)) $errors[] = "Name is
required.";
if (empty($email)) $errors[] = "Email
is required.";
if (!filter_var($email,
FILTER_VALIDATE_EMAIL)) $errors[] = "Invalid email format.";
if (empty($blood_group)) $errors[] = "Blood
group is required.";
// If no errors, insert into database
if (empty($errors)) {
$sql = "INSERT INTO requesters
(name, email, contact, blood_group, reason)
VALUES ('$name', '$email', '$contact',
'$blood_group', '$reason')";
if (mysqli_query($conn, $sql)) {
$success_message = "Requester
registered successfully!";
// Clear form fields
$name = $email = $contact = $blood_group
= $reason = "";
} else {
$errors[] = "Error: " . mysqli_error($conn);
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Register Blood
Requester</title>
<style>
body { font-family: Arial;
background-color: #f8f8f8; padding: 20px; }
.container {
max-width: 600px;
margin: auto;
background: white;
padding: 30px;
border-radius: 10px;
box-shadow: 0px 0px 10px #ccc;
}
input, select, textarea {
width: 100%; padding: 10px;
margin-bottom: 15px;
border: 1px solid #ccc;
border-radius: 5px;
}
button {
background-color: #007bff; color:
white;
border: none; padding: 10px 20px;
border-radius: 5px; cursor:
pointer;
}
.success { color: green; margin-bottom:
10px; }
.error { color: red; margin-bottom: 10px;
}
</style>
</head>
<body>
<div class="container">
<h2>Register New Blood Requester</h2>
<?php if (!empty($success_message)) echo
"<p class='success'>$success_message</p>"; ?>
<?php if (!empty($errors)) {
foreach ($errors as $error) {
echo "<p class='error'>⚠️ $error</p>";
}
} ?>
<form method="post" action="">
<label>Name:</label>
<input type="text" name="name"
value="<?php echo htmlspecialchars($name); ?>" required>
<label>Email:</label>
<input type="email" name="email"
value="<?php echo htmlspecialchars($email); ?>" required>
<label>Contact:</label>
<input type="text" name="contact"
value="<?php echo htmlspecialchars($contact); ?>">
<label>Blood Group:</label>
<select name="blood_group"
required>
<option value="">--Select
Blood Group--</option>
<?php
$groups = ['A+', 'A-', 'B+', 'B-',
'O+', 'O-', 'AB+', 'AB-'];
foreach ($groups as $group) {
$selected = ($blood_group
== $group) ? "selected" : "";
echo "<option
value='$group' $selected>$group</option>";
}
?>
</select>
<label>Reason for
Request:</label>
<textarea name="reason"><?php
echo htmlspecialchars($reason); ?></textarea>
<button type="submit">Register
Requester</button>
</form>
</div>
</body>
</html>
🧾 Features:
- Clean
input validation
- Displays
error or success messages
- Inserts
the requester into the requesters table
- Uses
dropdown for blood group
- Responsive
and styled with basic CSS
✅ edit_requester.php – Edit Existing
Requester Details
Note:
This file assumes the requester's ID is passed via a query string like edit_requester.php?id=3
<?php
// Start session
session_start();
// Include DB connection
include '../config/db_connect.php';
// Initialize variables
$id = $_GET['id'] ?? null;
$name = $email = $contact
= $blood_group = $reason = "";
$errors = [];
$success_message = "";
// Check if ID is valid
if (!$id || !is_numeric($id))
{
die("Invalid requester ID.");
}
// Fetch existing
requester details
$sql = "SELECT *
FROM requesters WHERE id = $id";
$result = mysqli_query($conn,
$sql);
if (mysqli_num_rows($result)
== 1) {
$requester = mysqli_fetch_assoc($result);
$name = $requester['name'];
$email = $requester['email'];
$contact = $requester['contact'];
$blood_group = $requester['blood_group'];
$reason = $requester['reason'];
} else {
die("Requester not found.");
}
// Handle update form
submission
if ($_SERVER["REQUEST_METHOD"]
== "POST") {
// Sanitize inputs
$name = trim(mysqli_real_escape_string($conn,
$_POST['name']));
$email = trim(mysqli_real_escape_string($conn,
$_POST['email']));
$contact = trim(mysqli_real_escape_string($conn,
$_POST['contact']));
$blood_group = $_POST['blood_group'];
$reason = trim(mysqli_real_escape_string($conn,
$_POST['reason']));
// Validation
if (empty($name)) $errors[] = "Name is
required.";
if (empty($email)) $errors[] = "Email
is required.";
if (!filter_var($email,
FILTER_VALIDATE_EMAIL)) $errors[] = "Invalid email format.";
if (empty($blood_group)) $errors[] = "Blood
group is required.";
// Update if no errors
if (empty($errors)) {
$sql_update = "UPDATE requesters
SET name='$name',
email='$email', contact='$contact', blood_group='$blood_group', reason='$reason'
WHERE id = $id";
if (mysqli_query($conn, $sql_update)) {
$success_message = "Requester
details updated successfully!";
} else {
$errors[] = "Update failed:
" . mysqli_error($conn);
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Edit Requester</title>
<style>
body { font-family: Arial;
background-color: #f4f4f4; padding: 20px; }
.container {
max-width: 600px;
margin: auto;
background: white;
padding: 30px;
border-radius: 10px;
box-shadow: 0px 0px 10px #ccc;
}
input, select, textarea {
width: 100%; padding: 10px;
margin-bottom: 15px;
border: 1px solid #ccc;
border-radius: 5px;
}
button {
background-color: #28a745; color:
white;
border: none; padding: 10px 20px;
border-radius: 5px; cursor:
pointer;
}
.success { color: green; margin-bottom:
10px; }
.error { color: red; margin-bottom: 10px;
}
</style>
</head>
<body>
<div class="container">
<h2>Edit Blood Requester</h2>
<?php if (!empty($success_message)) echo
"<p class='success'>$success_message</p>"; ?>
<?php foreach ($errors as $error) echo
"<p class='error'>⚠️
$error</p>"; ?>
<form method="post" action="">
<label>Name:</label>
<input type="text" name="name"
value="<?php echo htmlspecialchars($name); ?>" required>
<label>Email:</label>
<input type="email" name="email"
value="<?php echo htmlspecialchars($email); ?>" required>
<label>Contact:</label>
<input type="text" name="contact"
value="<?php echo htmlspecialchars($contact); ?>">
<label>Blood Group:</label>
<select name="blood_group"
required>
<option value="">--Select
Blood Group--</option>
<?php
$groups = ['A+', 'A-', 'B+', 'B-',
'O+', 'O-', 'AB+', 'AB-'];
foreach ($groups as $group) {
$selected = ($blood_group
== $group) ? "selected" : "";
echo "<option
value='$group' $selected>$group</option>";
}
?>
</select>
<label>Reason for
Request:</label>
<textarea name="reason"><?php
echo htmlspecialchars($reason); ?></textarea>
<button type="submit">Update
Requester</button>
</form>
</div>
</body>
</html>
✅ Features:
- Loads
existing requester info using the ID.
- Displays
the pre-filled form for editing.
- Validates
and updates data in the database.
- Provides
user-friendly feedback (success/error messages).
✅ delete_requester.php – Delete a
Requester
Assumption:
The requester ID is passed via query string like:
delete_requester.php?id=3
<?php
// Start session
session_start();
// Include database
connection
include '../config/db_connect.php';
// Get the requester ID
from query parameter
$id = $_GET['id'] ?? null;
// Validate the ID
if (!$id || !is_numeric($id))
{
die("Invalid requester ID.");
}
// First, check if the
requester exists
$check_sql = "SELECT
* FROM requesters WHERE id = $id";
$result = mysqli_query($conn,
$check_sql);
if (mysqli_num_rows($result)
=== 0) {
die("Requester not found.");
}
// Perform delete query
$delete_sql = "DELETE
FROM requesters WHERE id = $id";
if (mysqli_query($conn, $delete_sql))
{
// Redirect back to requester list with
success message
header("Location:
requester_list.php?msg=deleted");
exit;
} else {
echo "Error deleting requester: "
. mysqli_error($conn);
}
?>
✅ How it Works:
- Checks
if the id is passed and valid.
- Confirms
that the requester exists before deletion.
- Deletes
the record from the requesters table.
- Redirects
the user to requester_list.php with a query parameter ?msg=deleted which
can be used to show a confirmation message.
🔄 Optional: Show a success
message in requester_list.php:
You can add this at the
top of your requester_list.php:
<?php if (isset($_GET['msg'])
&& $_GET['msg'] == 'deleted'): ?>
<p class="success">✅ Requester deleted successfully.</p>
<?php endif; ?>
✅ requester_list.php – Display All
Requesters
<?php
// Start session
session_start();
// Include database
connection
include '../config/db_connect.php';
// Fetch all requesters
from the database
$sql = "SELECT *
FROM requesters ORDER BY created_at DESC";
$result = mysqli_query($conn,
$sql);
?>
<!DOCTYPE html>
<html>
<head>
<title>Requester List</title>
<style>
body { font-family: Arial; background: #f4f4f4;
padding: 20px; }
.container {
max-width: 900px;
margin: auto;
background: white;
padding: 30px;
border-radius: 10px;
box-shadow: 0 0 10px #ccc;
}
h2 {
text-align: center;
color: #333;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
table th, table td {
padding: 12px;
border: 1px solid #ccc;
text-align: center;
}
th {
background-color: #007bff;
color: white;
}
a.button {
padding: 6px 12px;
background-color: #28a745;
color: white;
text-decoration: none;
border-radius: 4px;
margin: 0 5px;
}
a.delete-btn {
background-color: #dc3545;
}
.message {
color: green;
margin-bottom: 15px;
text-align: center;
}
</style>
</head>
<body>
<div class="container">
<h2>Blood Requesters List</h2>
<!-- Success Message -->
<?php if (isset($_GET['msg']) &&
$_GET['msg'] == 'deleted'): ?>
<p class="message">✅ Requester deleted successfully.</p>
<?php endif; ?>
<table>
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Email</th>
<th>Contact</th>
<th>Blood Group</th>
<th>Reason</th>
<th>Registered At</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php if (mysqli_num_rows($result)
> 0): ?>
<?php $i = 1; while ($row = mysqli_fetch_assoc($result)):
?>
<tr>
<td><?php echo
$i++; ?></td>
<td><?php echo
htmlspecialchars($row['name']); ?></td>
<td><?php echo
htmlspecialchars($row['email']); ?></td>
<td><?php echo
htmlspecialchars($row['contact']); ?></td>
<td><?php echo
htmlspecialchars($row['blood_group']); ?></td>
<td><?php echo
htmlspecialchars($row['reason']); ?></td>
<td><?php echo
date("d M Y, h:i A", strtotime($row['created_at'])); ?></td>
<td>
<a class="button"
href="edit_requester.php?id=<?php echo $row['id']; ?>">Edit</a>
<a class="button
delete-btn" href="delete_requester.php?id=<?php echo $row['id'];
?>" onclick="return confirm('Are you sure you want to delete this requester?');">Delete</a>
</td>
</tr>
<?php endwhile; ?>
<?php else: ?>
<tr><td colspan="8">No
requesters found.</td></tr>
<?php endif; ?>
</tbody>
</table>
</div>
</body>
</html>
🔍 Features:
- Lists
all requester data: name, email, contact, blood group, reason,
registration date.
- Includes
Edit and Delete buttons.
- Shows
a confirmation dialog before deletion.
- Displays
a success message if a requester was deleted.