Webbserverprogrammering 1

Show sourcecode

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

webbserverprogrammering/submissions/projekt-quiz/

README.md
admin/
create_admin.php
create_quiz.php
css/
dashboard.php
debug_questions.php
includes/
index.php
leaderboard.php
login.php
logout.php
my_results.php
quiz.php
quiz_result.php
register.php
sqlcredentials

quiz.php

168 lines UTF-8 Unix (LF)
<?php
session_start
();
require_once 
'includes/db_connect.php';
require_once 
'includes/session_config.php';

requireLogin();

// Determine user_id based on session type
if (isset($_SESSION['admin_logged_in']) && $_SESSION['admin_logged_in'] === true) {
    
$current_user_id $_SESSION['admin_id'];
} else {
    
$current_user_id $_SESSION['user_id'];
}

$quiz_id = isset($_GET['id']) ? intval($_GET['id']) : 0;

if (!
$quiz_id) {
    
header("Location: dashboard.php");
    exit();
}

// Hämta quiz-info
$stmt $pdo->prepare("SELECT * FROM quizzes WHERE id = :id AND is_active = 1");
$stmt->execute([':id' => $quiz_id]);
$quiz $stmt->fetch(PDO::FETCH_ASSOC);

if (!
$quiz) {
    
header("Location: dashboard.php");
    exit();
}

// Hämta frågor och svar
$stmt $pdo->prepare("
    SELECT q.id, q.question_text, q.question_order
    FROM questions q
    WHERE q.quiz_id = :quiz_id
    ORDER BY q.question_order
"
);
$stmt->execute([':quiz_id' => $quiz_id]);
$questions $stmt->fetchAll(PDO::FETCH_ASSOC);

// Hämta svar för varje fråga
foreach ($questions as &$question) {
    
$stmt $pdo->prepare("
        SELECT id, answer_text, answer_order
        FROM answers
        WHERE question_id = :question_id
        ORDER BY answer_order
    "
);
    
$stmt->execute([':question_id' => $question['id']]);
    
$question['answers'] = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
unset(
$question); // Break the reference to prevent issues

// Hantera inskickat quiz
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    
$user_answers = isset($_POST['answers']) ? $_POST['answers'] : [];
    
    
$score 0;
    
$total_questions count($questions);
    
    
// Börja transaktion
    
$pdo->beginTransaction();
    
    try {
        
// Spara quiz attempt
        
$stmt $pdo->prepare("
            INSERT INTO quiz_attempts (user_id, quiz_id, score, total_questions, completed_at)
            VALUES (:user_id, :quiz_id, 0, :total_questions, NOW())
        "
);
        
$stmt->execute([
            
':user_id' => $current_user_id,
            
':quiz_id' => $quiz_id,
            
':total_questions' => $total_questions
        
]);
        
$attempt_id $pdo->lastInsertId();
        
        
// Kontrollera varje svar
        
foreach ($questions as $question) {
            
$question_id $question['id'];
            
$user_answer_id = isset($user_answers[$question_id]) ? intval($user_answers[$question_id]) : null;
            
            if (
$user_answer_id) {
                
// Kontrollera om svaret är rätt
                
$stmt $pdo->prepare("SELECT is_correct FROM answers WHERE id = :id");
                
$stmt->execute([':id' => $user_answer_id]);
                
$answer $stmt->fetch(PDO::FETCH_ASSOC);
                
                
$is_correct $answer['is_correct'];
                if (
$is_correct) {
                    
$score++;
                }
                
                
// Spara användarens svar
                
$stmt $pdo->prepare("
                    INSERT INTO user_answers (attempt_id, question_id, answer_id, is_correct)
                    VALUES (:attempt_id, :question_id, :answer_id, :is_correct)
                "
);
                
$stmt->execute([
                    
':attempt_id' => $attempt_id,
                    
':question_id' => $question_id,
                    
':answer_id' => $user_answer_id,
                    
':is_correct' => $is_correct
                
]);
            }
        }
        
        
// Uppdatera poäng
        
$stmt $pdo->prepare("UPDATE quiz_attempts SET score = :score WHERE id = :id");
        
$stmt->execute([':score' => $score':id' => $attempt_id]);
        
        
$pdo->commit();
        
        
// Omdirigera till resultat
        
header("Location: quiz_result.php?attempt_id=" $attempt_id);
        exit();
        
    } catch (
Exception $e) {
        
$pdo->rollBack();
        
$error "Ett fel uppstod. Försök igen.";
        
error_log("Quiz submission error: " $e->getMessage());
    }
}
$page_title htmlspecialchars($quiz['title']);
require_once 
'includes/header.php';
?>

    <div class="container">
        <div class="quiz-container">
            <h1><?php echo htmlspecialchars($quiz['title']); ?></h1>
            <p><?php echo htmlspecialchars($quiz['description']); ?></p>
            
            <?php if (isset($error)): ?>
                <div class="error-message"><?php echo htmlspecialchars($error); ?></div>
            <?php endif; ?>
            
            <form method="POST">
                <?php foreach ($questions as $index => $question): ?>
                    <div class="question-block">
                        <h3>Fråga <?php echo ($index 1); ?> av <?php echo count($questions); ?></h3>
                        <p class="question-text"><?php echo htmlspecialchars($question['question_text']); ?></p>
                        
                        <div class="answers">
                            <?php foreach ($question['answers'] as $answer): ?>
                                <label class="answer-option">
                                    <input 
                                        type="radio" 
                                        name="answers[<?php echo $question['id']; ?>]" 
                                        value="<?php echo $answer['id']; ?>"
                                        required
                                    >
                                    <?php echo htmlspecialchars($answer['answer_text']); ?>
                                </label>
                            <?php endforeach; ?>
                        </div>
                    </div>
                <?php endforeach; ?>
                
                <div class="form-actions">
                    <a href="dashboard.php" class="btn btn-secondary">Avbryt</a>
                    <button type="submit" class="btn btn-primary">Skicka in</button>
                </div>
            </form>
        </div>
    </div>

<?php require_once 'includes/footer.php'?>