Webbserverprogrammering 1

Show sourcecode

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

webbsrvprg/exercises/quiz/

create_test.php
create_test_fuckingtrasig.php
hash.php
index.php
login.php
main.php
personal_results.php
setup.php
sign_up.php
test_correcting.php
tests.php
user_administration.php
verification.php

create_test.php

193 lines UTF-8 Windows (CRLF)
<?php
session_start
(["gc_maxlifetime" => 86400]);
?>
<!DOCTYPE html>
<html lang="sv">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Skapa test</title>

    <style>
        fieldset {
            border: 3px solid black;
        }

        .ans_fieldset {
            border-color: gray;
        }

        .correct_select_fieldset {
            border-color: darkgreen;
        }

        .button {
            /* Kan inte använda <button> då formuläret tror man försöker lämna in det */
            border: 1px solid black;
            background-color: lightgray;
            width: 10vw;
            padding: 2px;
            cursor: pointer;
        }

        #submit_button {
            background-color: lightgreen;
        }
    </style>
</head>

<body>
    <h1>Lägg till fråga i test</h1>
    <form method="post">
        <?php
        
try {
            
/** @var PDO $dbconn */
            
include("../databaser/dbconnection.php");
            
$admin_required true// Kontrolleras i verification.php
            
include("verification.php");


            if (isset(
$_POST["test_name"])) {

                
// Börjar med att kolla om testet redan finns, annars skapar det.------------------------------
                
$sql "SELECT * FROM quiz_tests WHERE name = ?"
                
$stmt $dbconn->prepare($sql);
                
$stmt->execute([$_POST["test_name"]]);
                
$result $stmt->fetch(PDO::FETCH_ASSOC);

                
// Skapar testet om det inte redan finns
                
if($result){
                    
$test_id $result["id"];
                } else{
                    
// Lägger till i testet
                    
$sql "INSERT INTO quiz_tests (name) VALUES (?)";
                    
$stmt $dbconn->prepare($sql);
                    
$stmt->execute([$_POST["test_name"]]);

                    
$test_id $dbconn->lastInsertId();
                }
                
//----------------------------------------------------------------------------------------------

                // Lägger till frågan och alla svar
                
$answer_count $_POST["answer_count"];
                
$question $_POST["question"];

                
// Skapa frågan i databasen
                // Av någon anledning så skapas frågorna igen om man laddar om sidan men svaren gör inte det HM
                
$sql "INSERT INTO quiz_questions (text, correct, test_id) VALUES (?,?,?)";
                
$stmt $dbconn->prepare($sql);
                
$data = [$question$_POST["correct_a"], $test_id];
                
$stmt->execute($data);
                
$question_id $dbconn->lastInsertId();

                
$sql "INSERT INTO quiz_answers (text, answer_num, question_id) VALUES (?,?,?)";
                
$stmt $dbconn->prepare($sql); // Används i loopen

                
for ($i=1$i<=$answer_count$i++){
                    
// Börjar på 1, inte 0. Lägger till alla svar i databasen.
                    
$data = [$_POST["a" $i], $i$question_id];
                    
$stmt->execute($data);
                }
            }

        } catch (
PDOException $e) {
            echo (
$e->getMessage());
        }

        if (isset(
$_POST["test_name"])) {
            
// Om testet redan är påbörjat så fortsätter man på det
            
echo ("<h2>Testnamn: " $_POST["test_name"] . "</h2>");
            echo (
'<input type="hidden" name="test_name" value="' $_POST["test_name"] . '">');
        } else {
            
// Om det inte är påbörjat så får man välja namn
            
echo ('<input type="text" maxlength="100" required name="test_name" id="test_name"><label for="test_name">Namn på testet</label><br><p>Om du anger namn på redan existerande test läggs frågorna till på det. Nytt namn skapar nytt test.</p>');
        }
        
?>
        <input type="hidden" name="answer_count" id="answer_count" value="1"><!--Uppdateras av JS-->
        <input type="text" required id="question" name="question" maxlength="255" placeholder="Vad är 2+2?"><label for="question"> Frågeställning</label><br>

        <fieldset id="answers_fieldset" class="ans_fieldset">
            <legend>Svar</legend>
            <div id="a1_container"><input type="text" required id="a1" name="a1" maxlength="255" placeholder="4"><label for="a1"> Svar 1</label><br></div>
        </fieldset>

        <fieldset id="correct_fieldset" class="correct_select_fieldset">
            <!-- Här får man välja vilket svar som är korrekt. Det läggs till fler knappar allteftersom fler svar skapas. -->
            <legend>Vilket svar är korrekt?</legend>
            <div id="correct_1_container"><input type="radio" name="correct_a" id="correct_1" value="1"><label for="correct_1"> 1</label><br></div>
        </fieldset>

        <br>
        <div class="button" id="add_answer">Lägg till nytt svar</div>
        <br>
        <div class="button" id="remove_answer">Ta bort svar</div>
        <hr>
        <button type="submit" id="submit_button">Lägg till fråga och gå vidare</button>
    </form>
    <a href="main.php">Klar (se till att lägga till sista frågan först)</a>

    <script>
        function get(id) {
            return (document.getElementById(id));
        }

        let answer_count = 1; // Börjar med 1 svar på frågan

        function addAnswer() {
            answer_count += 1;
            get("answer_count").value = answer_count;

            // // Lägger till ett nytt svar. innerHTML += ... tömmer alla sparade values.
            // get("answers_fieldset").innerHTML += '<div id="a' + answer_count + '_container"><input type="text" required id="a' + answer_count + '" name="a' + answer_count + '" maxlength="255" placeholder="4"><label for="a' + answer_count + '"> Svar ' + answer_count + '</label><br></div>'


            // Lägger till en ny radio för att välja korrekt svar
            get("correct_fieldset").innerHTML += '<div id="correct_' + answer_count + '_container"><input type="radio" name="correct_a" id="correct_' + answer_count + '" value="' + answer_count + '"><label for="correct_' + answer_count + '"> ' + answer_count + '</label><br></div>'


            // AI skrivet för att lägga till ett nytt svar utan att behöva köra innerHTML += .... då detta tömmer information-------------------------------

            /* ====== SVAR ====== */
            const answerContainer = document.createElement("div");
            answerContainer.id = "a" + answer_count + "_container";

            const input = document.createElement("input");
            input.type = "text";
            input.required = true;
            input.id = "a" + answer_count;
            input.name = "a" + answer_count;
            input.maxLength = 255;
            input.placeholder = "4";

            const label = document.createElement("label");
            label.htmlFor = input.id;
            label.textContent = " Svar " + answer_count;

            answerContainer.appendChild(input);
            answerContainer.appendChild(label);
            answerContainer.appendChild(document.createElement("br"));

            get("answers_fieldset").appendChild(answerContainer);
        }

        function removeAnswer() {
            if (answer_count > 1) {
                // Tar inte bort om det bar finns ett svar
                // Containers används för att kunna ta bort input, label och <br> samtidigt
                const answer_id = "a" + answer_count + "_container";
                get(answer_id).remove();

                const radio_name = "correct_" + answer_count + "_container";
                get(radio_name).remove();

                answer_count -= 1;
            }
        }

        get("add_answer").addEventListener("click", addAnswer); // Kallar på funktionen när man klickar knappen
        get("remove_answer").addEventListener("click", removeAnswer); // Kallar på funktionen när man klickar knappen
    </script>
</body>

</html>