<?php
// Start session
session_start();
// Include database configuration
require_once '../config/database.php';
// Include header
include_once 'includes/header.php';
// Check if user is logged in and has admin or director role
if (!isset($_SESSION['user_id']) || ($_SESSION['role'] !== 'admin' && $_SESSION['role'] !== 'director')) {
header('Location: login.php');
exit;
}
// Check if an exam ID is provided
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
$_SESSION['error'] = "Invalid exam ID.";
header('Location: manage_exams.php');
exit;
}
$exam_id = $_GET['id'];
// Get exam details
$stmt = $conn->prepare("SELECT * FROM exam_schedules WHERE id = ?");
$stmt->bind_param("i", $exam_id);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 0) {
$_SESSION['error'] = "Exam not found.";
header('Location: manage_exams.php');
exit;
}
$exam = $result->fetch_assoc();
$stmt->close();
// Handle form submission
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Get form data
$title = trim($_POST['title']);
$description = trim($_POST['description']);
$course_id = $_POST['course_id'];
$exam_date = $_POST['exam_date'];
$start_time = $_POST['start_time'];
$end_time = $_POST['end_time'];
$duration = $_POST['duration'];
$passing_percentage = $_POST['passing_percentage'];
$status = $_POST['status'];
$instructions = trim($_POST['instructions']);
// Validate input
$errors = [];
if (empty($title)) {
$errors[] = "Title is required";
}
if (empty($course_id)) {
$errors[] = "Course is required";
}
if (empty($exam_date)) {
$errors[] = "Exam date is required";
}
if (empty($start_time)) {
$errors[] = "Start time is required";
}
if (empty($end_time)) {
$errors[] = "End time is required";
}
if (empty($duration) || !is_numeric($duration) || $duration <= 0) {
$errors[] = "Duration must be a positive number";
}
if (empty($passing_percentage) || !is_numeric($passing_percentage) || $passing_percentage < 0 || $passing_percentage > 100) {
$errors[] = "Passing percentage must be between 0 and 100";
}
// Check if start time is before end time
if (!empty($start_time) && !empty($end_time)) {
$start = strtotime($start_time);
$end = strtotime($end_time);
if ($start >= $end) {
$errors[] = "Start time must be before end time";
}
}
// If no errors, update the exam
if (empty($errors)) {
$query = "UPDATE exam_schedules SET
title = ?,
description = ?,
course_id = ?,
exam_date = ?,
start_time = ?,
end_time = ?,
duration_minutes = ?,
passing_percentage = ?,
is_active = ?,
instructions = ?
WHERE id = ?";
// Convert status to is_active (1 for active, 0 for inactive)
$is_active = ($status == 'active') ? 1 : 0;
$stmt = $conn->prepare($query);
$stmt->bind_param("ssisssiissi",
$title,
$description,
$course_id,
$exam_date,
$start_time,
$end_time,
$duration,
$passing_percentage,
$is_active,
$instructions,
$exam_id
);
if ($stmt->execute()) {
$_SESSION['success'] = "Exam updated successfully";
header("Location: manage_exams.php");
exit;
} else {
$_SESSION['error'] = "Error updating exam: " . $conn->error;
}
}
}
// Get all courses for the dropdown
$courses_query = "SELECT id, title FROM courses ORDER BY title";
$courses_result = $conn->query($courses_query);
?>
<div class="content-wrapper">
<div class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0">Edit Exam</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="index.php">Home</a></li>
<li class="breadcrumb-item"><a href="manage_exams.php">Manage Exams</a></li>
<li class="breadcrumb-item active">Edit Exam</li>
</ol>
</div>
</div>
</div>
</div>
<section class="content">
<div class="container-fluid">
<?php if (isset($errors) && !empty($errors)): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<h5><i class="icon fas fa-ban"></i> Error!</h5>
<ul>
<?php foreach ($errors as $error): ?>
<li><?php echo $error; ?></li>
<?php endforeach; ?>
</ul>
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<?php endif; ?>
<div class="card">
<div class="card-header">
<h3 class="card-title">Exam Details</h3>
<div class="card-tools">
<button type="button" class="btn btn-tool" data-card-widget="collapse">
<i class="fas fa-minus"></i>
</button>
</div>
</div>
<div class="card-body">
<form action="" method="POST">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="title">Exam Title <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="title" name="title" value="<?php echo htmlspecialchars($exam['title']); ?>" required>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="course_id">Course <span class="text-danger">*</span></label>
<select class="form-control" id="course_id" name="course_id" required>
<option value="">Select Course</option>
<?php while ($course = $courses_result->fetch_assoc()): ?>
<option value="<?php echo $course['id']; ?>" <?php echo ($exam['course_id'] == $course['id']) ? 'selected' : ''; ?>>
<?php echo htmlspecialchars($course['title']); ?>
</option>
<?php endwhile; ?>
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="form-group">
<label for="description">Description</label>
<textarea class="form-control" id="description" name="description" rows="3"><?php echo htmlspecialchars($exam['description']); ?></textarea>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="form-group">
<label for="exam_date">Exam Date <span class="text-danger">*</span></label>
<input type="date" class="form-control" id="exam_date" name="exam_date" value="<?php echo $exam['exam_date']; ?>" required>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="start_time">Start Time <span class="text-danger">*</span> (IST)</label>
<input type="time" class="form-control" id="start_time" name="start_time" value="<?php echo $exam['start_time']; ?>" required>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="end_time">End Time <span class="text-danger">*</span> (IST)</label>
<input type="time" class="form-control" id="end_time" name="end_time" value="<?php echo $exam['end_time']; ?>" required>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="form-group">
<label for="duration">Duration (minutes) <span class="text-danger">*</span></label>
<div class="input-group">
<input type="number" class="form-control" id="duration" name="duration" value="<?php echo $exam['duration_minutes']; ?>" min="1" required readonly>
<div class="input-group-append">
<span class="input-group-text"><i class="fas fa-clock"></i></span>
</div>
</div>
<small class="text-muted">Automatically calculated from start and end time</small>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="passing_percentage">Passing Percentage <span class="text-danger">*</span></label>
<input type="number" class="form-control" id="passing_percentage" name="passing_percentage" value="<?php echo $exam['passing_percentage']; ?>" min="0" max="100" required>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="status">Status <span class="text-danger">*</span></label>
<select class="form-control" id="status" name="status" required>
<option value="active" <?php echo ($exam['is_active'] == 1) ? 'selected' : ''; ?>>Active</option>
<option value="inactive" <?php echo ($exam['is_active'] == 0) ? 'selected' : ''; ?>>Inactive</option>
<option value="completed" <?php echo (isset($exam['status']) && $exam['status'] == 'completed') ? 'selected' : ''; ?>>Completed</option>
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="form-group">
<label for="instructions">Instructions</label>
<textarea class="form-control" id="instructions" name="instructions" rows="5"><?php echo htmlspecialchars($exam['instructions'] ?? ''); ?></textarea>
</div>
</div>
</div>
<div class="row mt-4">
<div class="col-md-12">
<div class="alert alert-info">
<i class="fas fa-info-circle"></i> You can manage exam questions from the <a href="map_questions.php?exam_id=<?php echo $exam_id; ?>">Manage Questions</a> page.
</div>
</div>
</div>
<div class="row mt-3">
<div class="col-md-12">
<button type="submit" class="btn btn-primary">
<i class="fas fa-save"></i> Update Exam
</button>
<a href="manage_exams.php" class="btn btn-secondary">
<i class="fas fa-times"></i> Cancel
</a>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
// Function to calculate duration in minutes between two times
function calculateDuration() {
const startTime = document.getElementById('start_time').value;
const endTime = document.getElementById('end_time').value;
if (startTime && endTime) {
// Convert to Date objects to calculate the difference
const startDate = new Date(`1970-01-01T${startTime}:00`);
const endDate = new Date(`1970-01-01T${endTime}:00`);
// Check if end time is earlier than start time (next day scenario)
let diff = endDate - startDate;
if (diff < 0) {
// End time is on the next day, add 24 hours
diff += 24 * 60 * 60 * 1000;
}
// Convert milliseconds to minutes
const durationMinutes = Math.round(diff / 60000);
// Ensure we have a positive value
const finalDuration = Math.max(1, durationMinutes);
// Update duration field
document.getElementById('duration').value = finalDuration;
}
}
// Calculate duration on load
calculateDuration();
// Set up event listeners for time inputs
document.getElementById('start_time').addEventListener('change', calculateDuration);
document.getElementById('end_time').addEventListener('change', calculateDuration);
});
</script>
<?php
// Include footer
include_once 'includes/footer.php';
?>