Webbserverprogrammering 1

Show sourcecode

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

webbsrvprg1/exercises/

index.php
ovn_class.php
ovn_cookies1.php
ovn_cookies2.php
ovn_cookies3.php
ovn_cookies3_hemlig.php
ovn_cookies4.php
ovn_cookies5.php
ovn_cookies_main.php
ovn_form1.php
ovn_form1_svar.php
ovn_form2.php
ovn_form2_svar.php
ovn_form3.php
ovn_form3_svar.php
ovn_form4.php
ovn_form4_svar.php
ovn_form5.php
ovn_form5_svar.php
ovn_form6.php
ovn_form6_svar.php
ovn_form7.php
ovn_form7_svar.php
ovn_form8.php
ovn_form_main.php
ovn_funk1.php
ovn_gr1.php
ovn_ink1_main.php
ovn_ink1_text.php
ovn_ink2_1.php
ovn_ink2_2.php
ovn_ink2_3.php
ovn_ink2_footer.php
ovn_ink2_header.php
ovn_ink2_main.php
ovn_ink_main.php
ovn_quiz.php
ovn_str.php
test.html

ovn_quiz.php

340 lines UTF-8 Windows (CRLF)
<?php
session_start
();

$losenord = "lösenord";

$fragor = [
    
1 => [
        
"fraga" => "När släpptes Hollow Knight?",
        
"alternativ" => [
            
"A" => "24 februari 2017",
            
"B" => "4 september 2025",
            
"C" => "6 december 2018",
            
"D" => "3 november 2023"
        
],
        
"ratt" => "A"
    
],
    
2 => [
        
"fraga" => "Vilket är det sämsta stället i Hollow Knight?",
        
"alternativ" => [
            
"A" => "Deepnest",
            
"B" => "The Hive",
            
"C" => "Royal Waterways",
            
"D" => "Greenpath"
        
],
        
"ratt" => "C"
    
],
    
3 => [
        
"fraga" => "Vilken ending får man om man klarar av Pantheon of Hallownest?",
        
"alternativ" => [
            
"A" => "The Hollow Knight",
            
"B" => "Sealed Siblings",
            
"C" => "Dream No more",
            
"D" => "Embrace the Void"
        
],
        
"ratt" => "D"
    
]
];

$steg = 0;
$namn = "";
$email = "";
$svar = [];
$resultat = false;
$felmeddelande = "";

if (
$_SERVER["REQUEST_METHOD"] == "POST") {

    if (isset(
$_POST["losenord"])) {
        if (
$_POST["losenord"] == $losenord) {
            
$_SESSION["inloggad"] = true;
        } else {
            
$felmeddelande = "Fel lösenord!";
        }
    }

    if (isset(
$_POST["borja_om"])) {
        
session_unset();
        
session_destroy();
        
header("Location: " . $_SERVER["PHP_SELF"]);
        exit;
    }

    if (isset(
$_SESSION["inloggad"]) &&
        
$_SESSION["inloggad"] === true &&
        isset(
$_POST["steg"])) {

        
$steg = (int) $_POST["steg"];
        
$namn = trim($_POST["namn"] ?? "");
        
$email = trim($_POST["email"] ?? "");

        
$svar = json_decode($_POST["svar"] ?? "{}", true);

        if (!
is_array($svar)) {
            
$svar = [];
        }

        if (
$steg >= 1 && $steg <= 3 &&
            isset(
$_POST["svar_" . $steg])) {

            
$valt = $_POST["svar_" . $steg];

            if (isset(
$fragor[$steg]["alternativ"][$valt])) {
                
$svar[$steg] = $valt;
            }
        }

        if (isset(
$_POST["nasta"])) {
            
$steg++;
        }

        if (isset(
$_POST["skicka"])) {
            
$resultat = true;
        }
    }
}

function 
sakerText($text) {
    return 
htmlspecialchars(
        (string)
$text,
        
ENT_QUOTES,
        
"UTF-8"
    
);
}
?>

<!DOCTYPE html>
<html lang="sv">
<head>
    <meta charset="UTF-8">
    <title>Frågetävling</title>

    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 700px;
            margin: 40px auto;
            padding: 20px;
            background: #f4f4f4;
        }

        main {
            background: white;
            padding: 25px;
            border-radius: 10px;
        }

        .alternativ {
            display: block;
            margin: 12px 0;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 5px;
        }

        .ratt {
            background: #b8f2c2;
        }

        .fel {
            background: #ffc4c4;
        }

        button {
            margin-top: 15px;
            padding: 10px 18px;
            cursor: pointer;
        }

        .felmeddelande {
            color: red;
        }
    </style>
</head>

<body>
<main>
    <h1>Frågetävling</h1>

    <?php if (!isset($_SESSION["inloggad"]) ||
              
$_SESSION["inloggad"] !== true) { ?>

        <h2>Ange lösenord</h2>

        <?php if ($felmeddelande != "") { ?>
            <p class="felmeddelande">
                <?= sakerText($felmeddelande) ?>
            </p>
        <?php } ?>

        <form method="post">
            <label for="losenord">Lösenord:</label>
            <input type="password" id="losenord"
                   name="losenord" required>
            <button type="submit">Logga in</button>
        </form>

    <?php } elseif ($resultat) { ?>

        <?php
        $poang 
= 0;
        
$mejltext = "Resultat från frågetävlingen\n\n";
        
$mejltext .= "Spelare: $namn\n";
        
$mejltext .= "Mejl: $email\n\n";

        foreach (
$fragor as $nummer => $fraga) {
            
$valt = $svar[$nummer] ?? "";

            if (
$valt == $fraga["ratt"]) {
                
$poang++;
            }

            
$mejltext .= "Fråga $nummer: "
                
. $fraga["fraga"] . "\n";

            
$mejltext .= "Ditt svar: "
                
. ($fraga["alternativ"][$valt] ?? "Inget svar")
                . 
"\n";

            
$mejltext .= "Rätt svar: "
                
. $fraga["alternativ"][$fraga["ratt"]]
                . 
"\n\n";
        }

        
$mejltext .= "Resultat: $poang av 3 rätt.";

        if (!isset(
$_SESSION["resultat_mail_skickat"])) {
            
$amne = "Ditt resultat från frågetävlingen";
            
            
$headers = "From: webb@noreply.se\r\n";
            
$headers .= "Reply-To: webb@noreply.se\r\n";
            
$headers .= "Content-Type: text/plain; charset=UTF-8\r\n";

            if (
filter_var($email, FILTER_VALIDATE_EMAIL) &&
                
mail($email, $amne, $mejltext, $headers)) {
                
$_SESSION["resultat_mail_skickat"] = true;
                
$mejl_skickat = true;
            } else {
                
$mejl_skickat = false;
            }
        } else {
            
$mejl_skickat = true;
        }
        
?>

        <h2>Resultat</h2>
        <p>Spelare: <strong><?= sakerText($namn) ?></strong></p>
        <p>Du fick <strong><?= $poang ?> av 3 rätt!</strong></p>

        <?php if ($mejl_skickat) { ?>
            <p>Resultatet har skickats till
                <?= sakerText($email) ?>.</p>
        <?php } else { ?>
            <p class="felmeddelande">
                Mejlet kunde inte skickas. Kontrollera
                mejladressen och att servern kan skicka mejl.
            </p>
        <?php } ?>

        <?php foreach ($fragor as $nummer => $fraga) { ?>
            <h3>Fråga <?= $nummer ?>:
                <?= sakerText($fraga["fraga"]) ?></h3>

            <?php foreach ($fraga["alternativ"] as $bokstav => $text) {
                
$klass = "";

                if (
$bokstav == $fraga["ratt"]) {
                    
$klass = "ratt";
                } elseif (isset(
$svar[$nummer]) &&
                          
$bokstav == $svar[$nummer]) {
                    
$klass = "fel";
                }
            
?>
                <div class="alternativ <?= $klass ?>">
                    <?= sakerText($bokstav) ?>.
                    <?= sakerText($text) ?>

                    <?php if ($bokstav == $fraga["ratt"]) {
                        echo 
" - Rätt svar";
                    } elseif (isset(
$svar[$nummer]) &&
                              
$bokstav == $svar[$nummer]) {
                        echo 
" - Ditt svar";
                    } 
?>
                </div>
            <?php } ?>
        <?php } ?>

        <form method="post">
            <button type="submit" name="borja_om" value="1">
                Börja om
            </button>
        </form>

    <?php } elseif (isset($_SESSION["inloggad"]) &&
                    
$_SESSION["inloggad"] === true) { ?>

        <?php if ($steg == 0) { ?>

            <h2>Välkommen!</h2>

            <form method="post">
                <label for="namn">Ditt namn:</label><br>
                <input type="text" id="namn" name="namn"
                       required maxlength="100"><br><br>

                <label for="email">Din mejladress:</label><br>
                <input type="email" id="email" name="email"
                       required><br><br>

                <input type="hidden" name="steg" value="0">
                <input type="hidden" name="svar" value="{}">

                <button type="submit" name="nasta" value="1">
                    Börja tävlingen
                </button>
            </form>

        <?php } elseif ($steg >= 1 && $steg <= 3) { ?>

            <h2>Fråga <?= $steg ?> av 3</h2>
            <p><?= sakerText($fragor[$steg]["fraga"]) ?></p>

            <form method="post">
                <input type="hidden" name="namn"
                       value="<?= sakerText($namn) ?>">
                <input type="hidden" name="email"
                       value="<?= sakerText($email) ?>">
                <input type="hidden" name="steg"
                       value="<?= $steg ?>">
                <input type="hidden" name="svar"
                       value="<?= sakerText(json_encode($svar)) ?>">

                <?php foreach ($fragor[$steg]["alternativ"]
                               as 
$bokstav => $text) { ?>
                    <label class="alternativ">
                        <input type="radio"
                               name="svar_<?= $steg ?>"
                               value="<?= sakerText($bokstav) ?>"
                               required>
                        <?= sakerText($bokstav) ?>.
                        <?= sakerText($text) ?>
                    </label>
                <?php } ?>

                <?php if ($steg < 3) { ?>
                    <button type="submit" name="nasta" value="1">
                        Nästa fråga
                    </button>
                <?php } else { ?>
                    <button type="submit" name="skicka" value="1">
                        Skicka in svar
                    </button>
                <?php } ?>
            </form>

        <?php } ?>

    <?php } ?>
</main>
</body>
</html>