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)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
<?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'; ?>