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

submit_quiz.php

94 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;
// Hämta namn från session, annars Guest
$name $loggedIn && isset($_SESSION['name']) ? htmlspecialchars($_SESSION['name']) : 'Guest';
?>

<?php
include('../dbconnection.php');

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

// Check auth
if (!$loggedIn || $loggedIn != 1) {
    echo 
"<div class='alert alert-error'>Access denied.</div>";
    echo 
'<div class="actions"><a class="btn" href="../login.php">Log in -></a></div>';
    exit;
}

// Måste ha quiz_id
if (!isset($_POST['quiz_id']) || empty($_POST['quiz_id'])) {
  echo 
"<div class='alert alert-warning'>No quiz selected.</div>";
  exit;
}

$quiz_id = (int)$_POST['quiz_id'];
$user_id $_SESSION['user_id'] ?? null;

// Samla alla question ids för detta quiz
$stmt $dbconn->prepare("SELECT question_id FROM questions WHERE quiz_id = ?");
$stmt->execute([$quiz_id]);
$questionIds $stmt->fetchAll(PDO::FETCH_COLUMN);
if (empty(
$questionIds)) {
  echo 
"<div class='alert alert-warning'>No questions found for this quiz.</div>";
  exit;
}

// Ladda answers med rätt eller fel
$placeholders implode(','array_fill(0count($questionIds), '?'));
$stmt $dbconn->prepare("SELECT answer_id, question_id, is_correct FROM answers WHERE question_id IN ($placeholders)");
$stmt->execute($questionIds);
$answerMap = [];
while (
$row $stmt->fetch(PDO::FETCH_ASSOC)) {
    
$answerMap[(int)$row['answer_id']] = [
        
'question_id' => (int)$row['question_id'],
        
'is_correct'  => (int)$row['is_correct']
    ];
}

try {
    
$dbconn->beginTransaction();

    
// Insert svar
    
$stmtSub $dbconn->prepare("INSERT INTO submissions (quiz_id, user_id, score) VALUES (?, ?, 0)");
    
$stmtSub->execute([$quiz_id$user_id]);
    
$submission_id = (int)$dbconn->lastInsertId();

    
$stmtSA $dbconn->prepare("INSERT INTO submission_answers (submission_id, question_id, answer_id, is_correct) VALUES (?, ?, ?, ?)");

    
$score 0;
    foreach (
$questionIds as $qid) {
        
$postKey 'question_' $qid;
        if (!isset(
$_POST[$postKey])) {
            continue; 
// Inget svar
        
}
        
$answer_id = (int)$_POST[$postKey];
        if (!isset(
$answerMap[$answer_id])) {
            continue; 
// Fel svars id
        
}
        
$isCorrect = (int)$answerMap[$answer_id]['is_correct'];
        
// Lägg till rätt svar i score
        
$score += $isCorrect;
        
$stmtSA->execute([$submission_id$qid$answer_id$isCorrect]);
    }

    
// Uppdatera score i table
    
$stmtUpd $dbconn->prepare("UPDATE submissions SET score = ? WHERE submission_id = ?");
    
$stmtUpd->execute([$score$submission_id]);

    
$dbconn->commit();

    
// Skicka till viewsubmissions för att se alla svar.
    
header("Location: viewsubmissions.php?quiz_id=" $quiz_id);
    exit;
} catch (
PDOException $e) {
    
$dbconn->rollBack();
    echo 
"<div class='alert alert-error'>Error: " htmlspecialchars($e->getMessage()) . "</div>";
}
?>