How to develop Projects(BDMS)
Using PHP and Mysql
Part 12
✅ Module 4: Blood Inventory
Management
🎯 Purpose:
Track and manage the blood stock available in blood banks, ensuring accurate
information for both hospitals and donors.
🔧 Functionalities to Implement:
- 🗂 Add new blood
     stock (blood group, quantity, collection date, expiry date).
 - ✏️ Update stock quantities
     after donations or blood request fulfillment.
 - 🔍 View available
     stock filtered by blood group and location.
 - ⚠️ Low stock alerts to notify
     admins or donors.
 - 🧾 Delete expired or
     used stock.
 
📁 Suggested File/Folder Structure:
/blood_inventory/
├── add_stock.php           # Add new blood stock
├── update_stock.php        # Update stock quantity or details
├── view_inventory.php      # Display available blood stock
├── delete_stock.php        # Remove expired or used stock
🧮 Suggested Database Table:
CREATE TABLE blood_inventory (
   
id INT AUTO_INCREMENT PRIMARY KEY,
   
blood_group VARCHAR(10) NOT NULL,
   
quantity INT NOT NULL,
   
collected_on DATE NOT NULL,
   
expiry_date DATE NOT NULL,
   
location VARCHAR(255) NOT NULL,
   
status ENUM('Available', 'Used', 'Expired') DEFAULT 'Available',
   
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
✅ Module 5: Donor Appointment
Scheduling
🎯 Purpose:
Allow donors to book appointments for blood donation at specific blood banks or
donation camps.
🔧 Functionalities to Implement:
- 📅 Book an appointment
     (date, time, location).
 - 📝 View scheduled
     appointments.
 - ❌ Cancel appointments.
 - 📨 Admin approval
     or reschedule suggestions.
 
📁 Suggested File/Folder Structure:
/appointments/
├── book_appointment.php     # Form to book a donation appointment
├── my_appointments.php      # Donor's appointment history
├── manage_appointments.php  # Admin panel to approve/reschedule
🧮 Suggested Database Table:
CREATE TABLE appointments (
   
id INT AUTO_INCREMENT PRIMARY KEY,
   
donor_id INT NOT NULL,
   
appointment_date DATE NOT NULL,
   
appointment_time TIME NOT NULL,
   
location VARCHAR(255) NOT NULL,
   
status ENUM('Pending', 'Confirmed', 'Cancelled') DEFAULT 'Pending',
   
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
   
FOREIGN KEY (donor_id) REFERENCES users(id)
);
✅ Module 6: Notification and Alerts
System
🎯 Purpose:
Keep users informed about blood request status, appointment reminders, and
system alerts via email, SMS, or system messages.
🔧 Functionalities to Implement:
- 🔔 New request alerts
     for suitable donors.
 - 📢 Status change
     notifications for requesters.
 - ⏰ Appointment reminders
     for donors.
 - 📬 Low stock warnings
     for admins.
 
📁 Suggested File/Folder Structure:
/notifications/
├── send_email.php           # Email sender logic
├── send_sms.php             # SMS sender logic (if applicable)
├── notification_list.php    # Admin view of all notifications
├── user_notifications.php   # User view of received alerts
🧮 Suggested Database Table:
CREATE TABLE notifications (
   
id INT AUTO_INCREMENT PRIMARY KEY,
   
user_id INT NOT NULL,
   
message TEXT NOT NULL,
   
type ENUM('Request', 'Appointment', 'Stock', 'General') DEFAULT 'General',
   
status ENUM('Unread', 'Read') DEFAULT 'Unread',
   
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
   
FOREIGN KEY (user_id) REFERENCES users(id)
);
Code in detail
💉 1️⃣ Database Table
First, run this SQL in phpMyAdmin to create the table
CREATE TABLE blood_inventory (    id INT AUTO_INCREMENT PRIMARY KEY,    blood_group VARCHAR(10) NOT NULL,    quantity INT NOT NULL,    collected_on DATE NOT NULL,    expiry_date DATE NOT NULL,    location VARCHAR(255) NOT NULL,    status ENUM('Available', 'Used', 'Expired') DEFAULT 'Available',    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
💻 2️⃣ add_stock.php
<?php$conn = new mysqli("localhost", "root", "", "your_database");  if (isset($_POST['submit'])) {    $blood_group = $_POST['blood_group'];    $quantity = $_POST['quantity'];    $collected_on = $_POST['collected_on'];    $expiry_date = $_POST['expiry_date'];    $location = $_POST['location'];      $sql = "INSERT INTO blood_inventory (blood_group, quantity, collected_on, expiry_date, location)             VALUES ('$blood_group', '$quantity', '$collected_on', '$expiry_date', '$location')";      if ($conn->query($sql) === TRUE) {        echo "Blood stock added successfully!";    } else {        echo "Error: " . $conn->error;    }}?>  <form method="post">    Blood Group: <input type="text" name="blood_group" required><br>    Quantity: <input type="number" name="quantity" required><br>    Collected On: <input type="date" name="collected_on" required><br>    Expiry Date: <input type="date" name="expiry_date" required><br>    Location: <input type="text" name="location" required><br>    <button type="submit" name="submit">Add Stock</button></form>
💻 3️⃣ update_stock.php
<?php$conn = new mysqli("localhost", "root", "", "your_database");  if (isset($_POST['update'])) {    $id = $_POST['id'];    $quantity = $_POST['quantity'];    $status = $_POST['status'];      $sql = "UPDATE blood_inventory SET quantity = '$quantity', status = '$status' WHERE id = '$id'";      if ($conn->query($sql) === TRUE) {        echo "Stock updated successfully!";    } else {        echo "Error: " . $conn->error;    }}?>  <form method="post">    Stock ID: <input type="number" name="id" required><br>    New Quantity: <input type="number" name="quantity" required><br>    Status:    <select name="status">        <option value="Available">Available</option>        <option value="Used">Used</option>        <option value="Expired">Expired</option>    </select><br>    <button type="submit" name="update">Update Stock</button></form>
💻 4️⃣ view_inventory.php
<?php$conn = new mysqli("localhost", "root", "", "your_database");  $result = $conn->query("SELECT * FROM blood_inventory");  echo "<table border='1'><tr><th>ID</th><th>Blood Group</th><th>Quantity</th><th>Collected On</th><th>Expiry Date</th><th>Location</th><th>Status</th></tr>";  while ($row = $result->fetch_assoc()) {    echo "<tr>    <td>{$row['id']}</td>    <td>{$row['blood_group']}</td>    <td>{$row['quantity']}</td>    <td>{$row['collected_on']}</td>    <td>{$row['expiry_date']}</td>    <td>{$row['location']}</td>    <td>{$row['status']}</td>    </tr>";}echo "</table>";?>
💻 5️⃣ delete_stock.php
<?php$conn = new mysqli("localhost", "root", "", "your_database");  if (isset($_POST['delete'])) {    $id = $_POST['id'];      $sql = "DELETE FROM blood_inventory WHERE id = '$id'";      if ($conn->query($sql) === TRUE) {        echo "Stock entry deleted!";    } else {        echo "Error: " . $conn->error;    }}?>  <form method="post">    Stock ID to Delete: <input type="number" name="id" required><br>    <button type="submit" name="delete">Delete Stock</button></form>
✅
Notes:
- Replace 
your_databasewith your real DB name. - Add Bootstrap for better design.
 - Add validation for production (to prevent SQL
     injection).
 
💾 Database Table: appointments
CREATE TABLE appointments (
    id INT AUTO_INCREMENT PRIMARY KEY,    donor_id INT NOT NULL,    appointment_date DATE NOT NULL,    appointment_time TIME NOT NULL,    location VARCHAR(255) NOT NULL,    status ENUM('Pending', 'Confirmed', 'Cancelled') DEFAULT 'Pending',    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,    FOREIGN KEY (donor_id) REFERENCES users(id));
💻 1️⃣ book_appointment.php
(Donor's
form to request an appointment)
<?php$conn = new mysqli("localhost", "root", "", "your_database");if (isset($_POST['submit'])) {    $donor_id = $_POST['donor_id'];  // In real life, use $_SESSION!    $appointment_date = $_POST['appointment_date'];    $appointment_time = $_POST['appointment_time'];    $location = $_POST['location'];      $sql = "INSERT INTO appointments (donor_id, appointment_date, appointment_time, location)             VALUES ('$donor_id', '$appointment_date', '$appointment_time', '$location')";      if ($conn->query($sql) === TRUE) {        echo "Appointment booked! Await admin confirmation.";    } else {        echo "Error: " . $conn->error;    }}?>  <form method="post">    Donor ID: <input type="number" name="donor_id" required><br>    Date: <input type="date" name="appointment_date" required><br>    Time: <input type="time" name="appointment_time" required><br>    Location: <input type="text" name="location" required><br>    <button type="submit" name="submit">Book Appointment</button></form>
💻 2️⃣ my_appointments.php
(Donor's
appointment history)
<?php$conn = new mysqli("localhost", "root", "", "your_database");$donor_id = 1; // Ideally, fetch from session  $result = $conn->query("SELECT * FROM appointments WHERE donor_id = '$donor_id'");  echo "<h2>My Appointments</h2>";echo "<table border='1'><tr><th>Date</th><th>Time</th><th>Location</th><th>Status</th><th>Booked On</th></tr>";  while ($row = $result->fetch_assoc()) {    echo "<tr>    <td>{$row['appointment_date']}</td>    <td>{$row['appointment_time']}</td>    <td>{$row['location']}</td>    <td>{$row['status']}</td>    <td>{$row['created_at']}</td>    </tr>";}echo "</table>";?>
💻 3️⃣ manage_appointments.php
(Admin:
approve / reschedule / cancel)
<?php$conn = new mysqli("localhost", "root", "", "your_database");if (isset($_POST['update'])) {    $id = $_POST['id'];    $status = $_POST['status'];      $sql = "UPDATE appointments SET status = '$status' WHERE id = '$id'";    if ($conn->query($sql) === TRUE) {        echo "Appointment updated!";    } else {        echo "Error: " . $conn->error;    }}  $result = $conn->query("SELECT * FROM appointments");  echo "<h2>Manage Appointments</h2>";echo "<table border='1'><tr><th>ID</th><th>Donor ID</th><th>Date</th><th>Time</th><th>Location</th><th>Status</th><th>Update</th></tr>";  while ($row = $result->fetch_assoc()) {    echo "<tr>    <form method='post'>        <td>{$row['id']}<input type='hidden' name='id' value='{$row['id']}'></td>        <td>{$row['donor_id']}</td>        <td>{$row['appointment_date']}</td>        <td>{$row['appointment_time']}</td>        <td>{$row['location']}</td>        <td>            <select name='status'>                <option value='Pending' " . ($row['status'] == 'Pending' ? 'selected' : '') . ">Pending</option>                <option value='Confirmed' " . ($row['status'] == 'Confirmed' ? 'selected' : '') . ">Confirmed</option>                <option value='Cancelled' " . ($row['status'] == 'Cancelled' ? 'selected' : '') . ">Cancelled</option>            </select>        </td>        <td><button type='submit' name='update'>Update</button></td>    </form>    </tr>";}echo "</table>";?>
✅
Summary:
book_appointment.php— Donor books an appointment.my_appointments.php— Donor sees their bookings.manage_appointments.php— Admin can approve, cancel, reschedule.
💾 Database Table: notifications
First,
create this table in phpMyAdmin:
CREATE TABLE notifications (    id INT AUTO_INCREMENT PRIMARY KEY,    user_id INT NOT NULL,    message TEXT NOT NULL,    type ENUM('Request', 'Appointment', 'Stock', 'General') DEFAULT 'General',    status ENUM('Unread', 'Read') DEFAULT 'Unread',    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,    FOREIGN KEY (user_id) REFERENCES users(id));
💻 1️⃣ send_email.php
(Sending
an email notification)
<?php$to = "user@example.com";  // Replace with recipient's email$subject = "Blood Donation Notification";$message = "Your blood donation appointment has been confirmed!";$headers = "From: admin@bloodbank.com";  if (mail($to, $subject, $message, $headers)) {    echo "Email sent successfully to $to.";} else {    echo "Email sending failed.";}?>
💻 2️⃣ send_sms.php
(Assuming
you're simulating SMS or using an API like Twilio — simple example here)
<?phpfunction sendSMS($phoneNumber, $message) {    // Replace this with real SMS API integration (Twilio, MSG91, etc.)    echo "Sending SMS to $phoneNumber: $message";}  $phoneNumber = "+911234567890"; // Example number$message = "Your blood donation appointment is confirmed!";sendSMS($phoneNumber, $message);?>
💻 3️⃣ notification_list.php
(Admin:
View all notifications)
<?php$conn = new mysqli("localhost", "root", "", "your_database");$result = $conn->query("SELECT * FROM notifications");  echo "<h2>All Notifications</h2>";echo "<table border='1'><tr><th>ID</th><th>User ID</th><th>Message</th><th>Type</th><th>Status</th><th>Date</th></tr>";  while ($row = $result->fetch_assoc()) {    echo "<tr>        <td>{$row['id']}</td>        <td>{$row['user_id']}</td>        <td>{$row['message']}</td>        <td>{$row['type']}</td>        <td>{$row['status']}</td>        <td>{$row['created_at']}</td>    </tr>";}echo "</table>";?>
💻 4️⃣ user_notifications.php
(User:
View their own notifications)
<?php$conn = new mysqli("localhost", "root", "", "your_database");$user_id = 1;  // Replace with session-based user ID  $result = $conn->query("SELECT * FROM notifications WHERE user_id = '$user_id' ORDER BY created_at DESC");  echo "<h2>Your Notifications</h2>";echo "<ul>";  while ($row = $result->fetch_assoc()) {    echo "<li><strong>[{$row['type']}]</strong> {$row['message']} - {$row['status']} ({$row['created_at']})</li>";}echo "</ul>";?>
✅
Summary:
  | 
  
   Send notification via
  email.  | 
 
| 
   
  | 
  
   Simulate/send SMS
  notifications.  | 
 
| 
   
  | 
  
   Admin can view all
  notifications.  | 
 
| 
   
  | 
  
   User can view their
  own notifications.  | 
 
