JezK
Edit File: functions.php
<?php require_once 'config.php'; require_once 'db.php'; // Authentication functions function login($email, $password) { global $session; $db = Database::getInstance(); // Log the login attempt error_log("Login attempt for email: " . $email); $user = $db->query(" SELECT id, username, password, user_type, full_name, email FROM users WHERE email = ? ", [$email])->fetch(); if ($user && password_verify($password, $user['password'])) { $session->login($user); // Log successful login error_log("Login successful for user: " . $email . " (ID: " . $user['id'] . ", Type: " . $user['user_type'] . ")"); return true; } // Log failed login error_log("Login failed for email: " . $email); return false; } function logout() { global $session; $session->logout(); } function isLoggedIn() { global $session; return $session->isLoggedIn(); } function isAdmin() { global $session; return $session->isAdmin(); } function isStudent() { global $session; return $session->isStudent(); } function requireLogin() { if (!isLoggedIn()) { redirect('../index.php'); } } function requireAdmin() { requireLogin(); if (!isAdmin()) { redirect('../student/dashboard.php'); } } // File upload functions function uploadFile($file, $targetDir, $allowedTypes = ['jpg', 'jpeg', 'png'], $maxSize = 5242880) { // Create directory if it doesn't exist if (!file_exists($targetDir)) { mkdir($targetDir, 0777, true); } // Validate file $fileType = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); if (!in_array($fileType, $allowedTypes)) { throw new Exception('Invalid file type'); } if ($file['size'] > $maxSize) { throw new Exception('File too large'); } // Generate unique filename $fileName = uniqid() . '.' . $fileType; $targetPath = $targetDir . '/' . $fileName; // Move file if (!move_uploaded_file($file['tmp_name'], $targetPath)) { throw new Exception('Failed to upload file'); } return $fileName; } // Sanitization and validation functions function sanitizeInput($input) { if (is_array($input)) { return array_map('sanitizeInput', $input); } return htmlspecialchars(trim($input), ENT_QUOTES, 'UTF-8'); } function validateEmail($email) { return filter_var($email, FILTER_VALIDATE_EMAIL); } function validateUsername($username) { return preg_match('/^[a-zA-Z0-9_]{3,20}$/', $username); } function validatePassword($password) { return strlen($password) >= 8; } // CSRF protection function generateCSRFToken() { global $session; $token = bin2hex(random_bytes(32)); $session->set('csrf_token', $token); return $token; } function validateCSRFToken($token) { global $session; return hash_equals($session->get('csrf_token', ''), $token); } // Quiz related functions function calculateScore($quizAssignmentId) { $db = Database::getInstance(); return $db->query(" SELECT COALESCE(SUM( CASE WHEN o.is_correct = 1 THEN s.correct_marks WHEN o.is_correct = 0 THEN -s.negative_marks ELSE 0 END ), 0) as total_score FROM responses r INNER JOIN questions q ON r.question_id = q.id INNER JOIN sections s ON q.section_id = s.id LEFT JOIN options o ON r.selected_option_id = o.id WHERE r.quiz_assignment_id = ? ", [$quizAssignmentId])->fetch()['total_score']; } // Time formatting function formatDuration($minutes) { $hours = floor($minutes / 60); $mins = $minutes % 60; return sprintf('%02d:%02d:00', $hours, $mins); } // Response functions function jsonResponse($data, $statusCode = 200) { http_response_code($statusCode); header('Content-Type: application/json'); echo json_encode($data); exit; }