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)
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
<?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(0, count($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>";
}
?>