Webbserver - Love Blomberg

Show sourcecode

The following files exists in this folder. Click to view.

public_html/exercises/quizproject/quiz/

createquiz.php
submission.php
submit_quiz.php
takequiz.php
viewquizzes.php
viewsubmissions.php

submission.php

221 lines UTF-8 Windows (CRLF)
<?php
session_start
();

// Auth så att användare är inloggad och/eller admin
$loggedIn = isset($_SESSION['logged_in']) && $_SESSION['logged_in'] == 1;
$isAdmin = isset($_SESSION['is_admin']) && $_SESSION['is_admin'] == 1;

include(
'../dbconnection.php');
if (!
$dbconn) {
    die(
"Connection failed: Can't connect to database.");
}

// Check auth
if (!$loggedIn || $loggedIn != 1) {
    
header("Location: ../login.php");
    exit;
}

// Must have submission_id
if (!isset($_GET['submission_id']) || empty($_GET['submission_id'])) {
    
header("Location: ../index.php");
    exit;
}

$submission_id intval($_GET['submission_id']);
$user_id $_SESSION['user_id'] ?? null;

try {
    
// Hämta submission info innan html för att få all data direkt
    
$stmt $dbconn->prepare("
        SELECT s.submission_id, s.quiz_id, s.user_id, s.submitted_time, s.score, q.quiz_name, u.username
        FROM submissions s
        JOIN quizzes q ON s.quiz_id = q.quiz_id
        JOIN users u ON s.user_id = u.user_id
        WHERE s.submission_id = ?
    "
);
    
$stmt->execute([$submission_id]);
    
$submission $stmt->fetch(PDO::FETCH_ASSOC);

    
// Skicka tillbaks om inga submissions finns
    
if (!$submission) {
        
header("Location: ../index.php");
        exit;
    }

    
// Authorization: user who submitted or admin
    
if (($submission['user_id'] != $user_id) && ($_SESSION['is_admin'] != 1)) {
        
header("Location: ../index.php");
        exit;
    }
} catch (
PDOException $e) {
    
header("Location: ../index.php");
    exit;
}
?>

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Quizzer | Submission Review</title>
 <link rel="stylesheet" href="../quiz_styles.css">
 <link rel="shortcut icon" href="../icons/google-quiz-icon.svg" type="image/x-icon">
 <style>
 /**Lite extra syle för svar */
 .answer-option {
  padding: 12px;
  margin: 8px 0;
  border: 2px solid #ddd;
  border-radius: 4px;
  cursor: pointer;
 }

 .answer-option.correct {
  border-color: #28a745;
 }

 .answer-option.incorrect {
  border-color: #dc3545;
 }

 .answer-option.user-selected {
  border-width: 3px;
  font-weight: bold;
 }

 .result-badge {
  display: inline-block;
  padding: 4px 12px;
  border-radius: 12px;
  font-size: 0.9em;
  margin-left: 8px;
 }

 .result-badge.correct {
  background-color: #28a745;
  color: white;
 }

 .result-badge.incorrect {
  background-color: #dc3545;
  color: white;
 }
 </style>
</head>

<body>
 <div class="page page-narrow">
  <div class="page-header">
   <div>
    <h1 class="page-title">Submission View</h1>
    <p class="page-subtitle">View quiz submission.</p>
   </div>

   <div class="actions">
    <a class="btn btn-ghost"
     href="./viewsubmissions.php?quiz_id=<?php echo htmlspecialchars($submission['quiz_id']); ?>">&#8592; Back to
     submissions</a>
   </div>
  </div>

  <div class="quiz-container">
   <?php
            
try {
                echo 
"<h1 class='page-title'>" htmlspecialchars($submission['quiz_name']) . "</h1>";
                echo 
"<p><strong>Submitted by:</strong> " htmlspecialchars($submission['username']) . "</p>";
                echo 
"<p><strong>Date:</strong> " htmlspecialchars($submission['submitted_time']) . "</p>";
                echo 
"<p><strong>Score:</strong> " htmlspecialchars($submission['score'] ?? 'Not graded') . "</p>";

                
// Get questions and user answers
                
$stmt $dbconn->prepare("
                    SELECT DISTINCT q.question_id, q.question
                    FROM questions q
                    WHERE q.quiz_id = ?
                    ORDER BY q.question_id
                "
);
                
$stmt->execute([$submission['quiz_id']]);
                
$questions $stmt->fetchAll(PDO::FETCH_ASSOC);

                if (empty(
$questions)) {
                    echo 
"<div class='alert alert-warning'>No questions found for this quiz.</div>";
                    exit;
                }

                foreach (
$questions as $index => $question) {
                    
// Get all answers for this question
                    
$stmt $dbconn->prepare("
                        SELECT answer_id, answer, is_correct
                        FROM answers
                        WHERE question_id = ?
                        ORDER BY answer_id
                    "
);
                    
$stmt->execute([$question['question_id']]);
                    
$answers $stmt->fetchAll(PDO::FETCH_ASSOC);

                    
// Get user's answer(s) for this question
                    
$stmt $dbconn->prepare("SELECT answer_id, is_correct FROM submission_answers WHERE submission_id = ? AND question_id = ?");
                    
$stmt->execute([$submission_id$question['question_id']]);
                    
$userAnswers $stmt->fetchAll(PDO::FETCH_ASSOC);
          
// Mappa alla svar till en array map
                    
$userAnswerIds array_map(function($a) { return $a['answer_id']; }, $userAnswers);
                    
$questionCorrect = !empty($userAnswers) && count(array_filter($userAnswers, function($a) { return $a['is_correct']; })) === count($userAnswers);

          
// Skriv ut alla frågor samt om de är korrekt eller ej
                    
echo "<div class='card'>";
                    echo 
"<h3>Question " . ($index 1) . ": " htmlspecialchars($question['question']);
          
// Sätt style för fel / rätt svar
                    
echo "<span class='result-badge " . ($questionCorrect "correct" "incorrect") . "'>";
                    echo 
$questionCorrect "✓ Correct" "✗ Incorrect";
                    echo 
"</span></h3>";

          
// Skriv ut alla svar med rätt / fel
                    
foreach ($answers as $answer) {
                        
$isCorrect $answer['is_correct'] == 1;
                        
$userSelected in_array($answer['answer_id'], $userAnswerIds);
                        
            
// Sätt rätt färg
                        
$classes "answer-option";
                        if (
$isCorrect) {
                            
$classes .= " correct";
                        } elseif (
$userSelected) {
                            
$classes .= " incorrect";
                        }
            
// Sätt svarad av användare
                        
if ($userSelected) {
                            
$classes .= " user-selected";
                        }

                        echo 
"<div class='" $classes "'>";
                        echo 
htmlspecialchars($answer['answer']);
            
// Sätt correct badge på svar
                        
if ($isCorrect) {
                            echo 
" <strong style='color: #28a745;'>✓ Correct</strong>";
                        }
            
// Användare och fel
                        
if ($userSelected && !$isCorrect) {
                            echo 
" <strong style='color: #dc3545;'>✗ Your answer</strong>";
                        }
            
// Användare och korrekt
                        
if ($userSelected && $isCorrect) {
                            echo 
" <strong style='color: #28a745;'>✓ Your answer</strong>";
                        }
                        echo 
"</div>";
                    }

                    echo 
"</div>";
                }
            } catch (
PDOException $e) {
                echo 
"<div class='alert alert-error'>Error: " htmlspecialchars($e->getMessage()) . "</div>";
                echo 
'<div class="actions"><a class="btn btn-secondary" href="../index.php">Back to dashboard -></a></div>';
            }

            
$dbconn null;
            
?>
  </div>
 </div>
</body>

</html>