Path : /home/vishqocm/pcib.in/admin/database/
File Upload :
Current File : /home/vishqocm//pcib.in/admin/database/fix_exam_tables.php

<?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;
?>