<?php
// Start session
session_start();
// Include database configuration
require_once '../../config/database.php';
// Check if user is logged in and has admin role
if (!isset($_SESSION['user_id']) || ($_SESSION['role'] !== 'admin' && $_SESSION['role'] !== 'director')) {
header('Location: ../login.php');
exit;
}
// Initialize messages array
$messages = [];
$success = true;
// Function to log detailed messages with timestamps
function log_message($message, $type = 'info') {
global $messages;
$timestamp = date('Y-m-d H:i:s');
$log_message = "[$timestamp] [$type] $message";
$messages[] = ['type' => $type, 'message' => $message];
error_log($log_message);
return $log_message;
}
// Check existing tables
log_message("Starting database check and fix process");
// Check if question_banks table exists
$check_table = $conn->query("SHOW TABLES LIKE 'question_banks'");
$question_banks_exists = $check_table->num_rows > 0;
if (!$question_banks_exists) {
log_message("question_banks table does not exist, creating it", 'warning');
// Create question_banks table
$create_question_banks = "CREATE TABLE IF NOT EXISTS `question_banks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`description` text DEFAULT NULL,
`course_id` int(11) DEFAULT NULL,
`status` ENUM('active', 'inactive') NOT NULL DEFAULT 'active',
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
`updated_at` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`),
KEY `course_id` (`course_id`),
CONSTRAINT `question_banks_course_id_fk` FOREIGN KEY (`course_id`) REFERENCES `courses` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci";
if ($conn->query($create_question_banks)) {
log_message("question_banks table created successfully", 'success');
// Create a default question bank
$insert_default_bank = "INSERT INTO `question_banks` (`title`, `description`, `status`)
VALUES ('General Question Bank', 'Default question bank for general questions', 'active')";
if ($conn->query($insert_default_bank)) {
log_message("Created default question bank", 'success');
} else {
log_message("Error creating default question bank: " . $conn->error, 'error');
$success = false;
}
} else {
log_message("Error creating question_banks table: " . $conn->error, 'error');
$success = false;
}
} else {
log_message("question_banks table already exists");
// Verify table structure
$columns_result = $conn->query("SHOW COLUMNS FROM `question_banks`");
$columns = [];
while ($column = $columns_result->fetch_assoc()) {
$columns[$column['Field']] = $column;
}
// Check for required columns
if (!isset($columns['course_id'])) {
log_message("course_id column missing in question_banks table, adding it", 'warning');
// Add course_id column
$add_column_query = "ALTER TABLE `question_banks`
ADD COLUMN `course_id` int(11) DEFAULT NULL AFTER `description`,
ADD KEY `course_id` (`course_id`),
ADD CONSTRAINT `question_banks_course_id_fk` FOREIGN KEY (`course_id`)
REFERENCES `courses` (`id`) ON DELETE SET NULL";
if ($conn->query($add_column_query)) {
log_message("course_id column added to question_banks table", 'success');
} else {
log_message("Error adding course_id column: " . $conn->error, 'error');
$success = false;
}
}
if (!isset($columns['status'])) {
log_message("status column missing in question_banks table, adding it", 'warning');
// Add status column
$add_column_query = "ALTER TABLE `question_banks`
ADD COLUMN `status` ENUM('active', 'inactive') NOT NULL DEFAULT 'active'
AFTER `course_id`";
if ($conn->query($add_column_query)) {
log_message("status column added to question_banks table", 'success');
} else {
log_message("Error adding status column: " . $conn->error, 'error');
$success = false;
}
}
}
// Check if questions table exists and has question_bank_id column
$check_table = $conn->query("SHOW TABLES LIKE 'questions'");
$questions_exists = $check_table->num_rows > 0;
if ($questions_exists) {
log_message("questions table exists, checking column structure");
// Check if question_bank_id field exists
$check_field = $conn->query("SHOW COLUMNS FROM `questions` LIKE 'question_bank_id'");
$question_bank_field_exists = $check_field->num_rows > 0;
if (!$question_bank_field_exists) {
log_message("question_bank_id column missing in questions table, adding it", 'warning');
$alter_query = "ALTER TABLE `questions`
ADD COLUMN `question_bank_id` int(11) NULL AFTER `question_text`,
ADD KEY `question_bank_id` (`question_bank_id`),
ADD CONSTRAINT `questions_question_bank_fk` FOREIGN KEY (`question_bank_id`)
REFERENCES `question_banks` (`id`) ON DELETE SET NULL";
if ($conn->query($alter_query)) {
log_message("question_bank_id column added to questions table", 'success');
} else {
log_message("Error adding question_bank_id column: " . $conn->error, 'error');
$success = false;
}
}
} else {
log_message("questions table does not exist. Please run the full database setup script.", 'error');
$success = false;
}
// Check if exam_question_maps table exists
$check_table = $conn->query("SHOW TABLES LIKE 'exam_question_maps'");
$exam_question_maps_exists = $check_table->num_rows > 0;
if (!$exam_question_maps_exists) {
log_message("exam_question_maps table does not exist, creating it", 'warning');
$create_exam_question_maps = "CREATE TABLE IF NOT EXISTS `exam_question_maps` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`exam_id` int(11) NOT NULL,
`question_id` int(11) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `exam_question_unique` (`exam_id`, `question_id`),
KEY `exam_id` (`exam_id`),
KEY `question_id` (`question_id`),
CONSTRAINT `exam_question_maps_exam_fk` FOREIGN KEY (`exam_id`) REFERENCES `exam_schedules` (`id`) ON DELETE CASCADE,
CONSTRAINT `exam_question_maps_question_fk` FOREIGN KEY (`question_id`) REFERENCES `questions` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
if ($conn->query($create_exam_question_maps)) {
log_message("exam_question_maps table created successfully", 'success');
} else {
log_message("Error creating exam_question_maps table: " . $conn->error, 'error');
$success = false;
}
} else {
log_message("exam_question_maps table already exists");
}
// Set session messages
$_SESSION['fix_messages'] = $messages;
$_SESSION['fix_success'] = $success;
// Redirect back to the map_questions page
header('Location: ../map_questions.php?exam_id=' . ($_GET['exam_id'] ?? ''));
exit;
?>