Vorlesung und Übung Universität Paderborn Wintersemester 2015/2016 Dr. Peter Pfahler Sitzungs-Verwaltung/ Session Management EWS, WS 2015/16, Pfahler Q-1 Sitzungs-Verwaltung Anwendung Ratespiel Man hat 7 Versuche, eine Zahl zwischen 1 und 100 zu raten. Eine solche Anwendung muss über mehrere Seitenbesuche (= Sitzung) hinweg einen Zustand aufbewahren. Nur so können für die einzelnen Nutzer die zu ratende Zahl und die verbleibenden Rateversuche gespeichert werden. HTTP als zustandsloses Protokoll unterstützt die Bewahrung eines Zustands während einer Sitzung nicht. Möglichkeiten der Sitzungs-Verwaltung in PHP: ● versteckte Formularfelder ● Cookies ● PHP-Session-Mechanismus EWS, WS 2015/16, Pfahler Q-2 Methode 1: Versteckte Formularfelder Quelltext für das Formular des Ratespiels: Der Zustand der Anwendung wird in den Formulardaten versteckt und so über mehrere Seitenbesuche hinweg zwischen Server und Client übertragen. <html> <head> <title>Rat die Zahl</title> </head> <body bgcolor="#FFFFFF"> <h3>Zu niedrig.</h3> <p>Du hast noch 3 Versuche!</p> <form action="guess.php" method=POST> <input type=hidden name="zahl" value=17> <input type=hidden name="versuche" value=5> <p>Rate die Zahl zwischen 1 und 100:</p> <input type=text name="geraten"><br> <input type=submit value="Richtig?"> </form> </body> </html> Q-3 EWS, WS 2015/16, Pfahler Das PHP-Programm für das Ratespiel (1) $max_zahl = 100; $newgame = !isset($_POST['geraten']); if ($newgame) { // Neue Zahl würfeln $zahl = rand(1, $max_zahl); $versuche = 0; } else { // Eingaben prüfen, Feedback geben $zahl = (int) $_POST['zahl']; $versuche = (int) $_POST['versuche']; $geraten = (int) $_POST['geraten']; Hidden Fields Version if ($geraten == $zahl) { echo '<h1 align="center">Du hast gewonnen!</h1>'; echo '</body></html>'; exit; } EWS, WS 2015/16, Pfahler Q-4 Das PHP-Programm für das Ratespiel (2) else { if ($geraten < $zahl) { echo "<h3>Zu niedrig.</h3>"; } else { echo "<h3>Zu hoch.</h3>"; } } Hidden Fields Version } if ($versuche >= $max_versuche) { // Spiel ist aus echo '<h1 align="center">Du hast verloren! </h1>'; echo "<p>Die Zahl war $zahl.</p>"; echo '</body></html>'; exit; } Q-5 EWS, WS 2015/16, Pfahler Das PHP-Programm für das Ratespiel (3) $v = $max_versuche - $versuche; echo "Du hast noch $v Versuche!"; $versuche++ ?> Hidden Fields Version <form action="guess.php" method=POST> <input type=hidden name="zahl" value=<?php echo $zahl ?> > <input type=hidden name="versuche" value=<?php echo $versuche ?> > <p>Rate die Zahl zwischen 1 und <?php echo $max_zahl ?>: </p> <input type=text name="geraten"><br> <input type=submit value="Richtig?"> </form> </body> </html> EWS, WS 2015/16, Pfahler Q-6 Methode 2: Cookies Cookies ("Kekse") sind ein Mechanismus, um Informationen beim Client zu speichern und somit wiederkehrende Besuche identifizieren zu können. Cookies werden im HTTP-ProtokollKopf übertragen: Vom Server zu Client: (vor der Ausgabe von HTML-Text!) setcookie( name, value, [ exp, path, domain, security ]); exp ist das Verfallsdatum (Sekunden seit Beginn der Unix-Zeitrechnung). Standard: Verfall am Ende der Browser-Sitzung. Vom Client zum Server: automatisch durch den Browser, der auch für die Client-seitige Speicherung und Verwaltung der Cookies zuständig ist. Im Falle von PHP finden sich die Cookies im vordefinierten Array $_COOKIES. Typisches Muster: if (!isset($_COOKIE['anzvers'])) { $versuche = 0; setcookie('anzvers', $versuche, time() + 5*60); // Lebensdauer: 5 Minuten } else $versuche = (int) $_COOKIE['anzvers']; EWS, WS 2015/16, Pfahler Q-7 Cookie zum Zählen individueller Besuche <?php if (!isset($_COOKIE['count'])) { $count = 0; } Ein Jahr else { $count = $_COOKIE['count']; } $count = $count + 1; setcookie('count', $count, time() + 60 * 60 * 24 * 365); ?> <html> <body> <?PHP echo "<h1>Your visit No. $count</h1>"; ?> </body> </html> EWS, WS 2015/16, Pfahler Q-8 Das PHP-Programm für das Ratespiel (1) <?php $max_versuche = 7; $max_zahl = 100; $newgame = !isset($_POST['geraten']); Cookie Version if ($newgame) { // Neue Zahl würfeln $zahl = rand(1, $max_zahl); setcookie('zahl', $zahl); $versuche = 0; } else { // Spieldaten besorgen $zahl = $_COOKIE['zahl']; $versuche = $_COOKIE['versuche'] + 1; } // Versuchsanzahl korrigieren setcookie('versuche', $versuche); ?> Alle setcookie()-Aufrufe vor dem Start der HTMLAusgabe. Q-9 EWS, WS 2015/16, Pfahler Das PHP-Programm für das Ratespiel (2) <html> <head><title>Rat die Zahl</title></head> <body> <?php if (isset($_POST['geraten'])) { $geraten = (int) $_POST['geraten']; Cookie Version if ($geraten == $zahl) { echo '<h1 align="center">Du hast gewonnen!</h1>'; echo '</body></html>'; exit; } else { if ($geraten < $zahl) { echo "<h3>Zu niedrig.</h3>"; } else { echo "<h3>Zu hoch.</h3>"; } } } EWS, WS 2015/16, Pfahler Q-10 Das PHP-Programm für das Ratespiel (3) if ($versuche >= $max_versuche) { echo '<h1 align="center">Du hast verloren!</h1>'; echo "<p>Die Zahl war $zahl.</p>"; Cookie echo '</body></html>'; Version exit; } ?> <p>Du hast noch <?php echo ($max_versuche - $versuche) . " "?> Versuche! </p> <form action="guess_cookies.php" method=POST> <p>Rate die Zahl zwischen 1 und <?php echo $max_zahl ?>:</p> <input type=text name="geraten"><br> <input type=submit value="Richtig?"> </form> </body> </html> EWS, WS 2015/16, Pfahler Q-11 Methode 3: PHP-Session-Mechanismus Besucher einer Website erhalten eine eindeutige ID, die sogenannte Session-ID. Diese wird z.B. in einem Cookie abgelegt. Über diese ID steht der Anwendung ein Bereich des vordefinierte Arrays $_SESSION zur Ablage Besuchsübergreifender Daten zur Verfügung. Erzeugen einer Session: session_start() Löschen einer Session: session_destroy() Beispiel: Ein individueller Besuchszähler <?php session_start(); //vor dem HTML ?> <html> <body> <?php if (!isset($_SESSION['count'])) { $_SESSION['count'] = 1; } else { $_SESSION['count']++; } $v = $_SESSION['count']; echo "<h1>Your visit No. $v</h1>"; ?> </body> </html> EWS, WS 2015/16, Pfahler Q-12 Das PHP-Programm für das Ratespiel (1) <?php session_start(); ?> <html> <head><title>Rat die Zahl</title></head> <body> Session Version <?php $max_versuche = 7; $max_zahl = 100; $newgame = !isset($_POST['geraten']); if ($newgame) { // neu würfeln, zahl speichern $zahl = rand(1, $max_zahl); $versuche = 0; $_SESSION['zahl'] = $zahl; } else { // Eingaben prüfen, Feedback $zahl = (int) $_SESSION['zahl']; $versuche = (int) $_SESSION['versuche']; $geraten = (int) $_POST['geraten']; Q-13 EWS, WS 2015/16, Pfahler Das PHP-Programm für das Ratespiel (2) if ($geraten == $zahl) { echo '<h1 align="center">Du hast gewonnen!</h1>'; echo '</body></html>'; session_destroy(); exit; } else { if ($geraten < $zahl) { echo "<h3>Zu niedrig.</h3>"; } else { echo "<h3>Zu hoch.</h3>"; } } Session Version } EWS, WS 2015/16, Pfahler Q-14 Das PHP-Programm für das Ratespiel (3) if ($versuche >= $max_versuche) { echo '<h1 align="center">Du hast verloren!</h1>'; echo "<p>Die Zahl war $zahl.</p>"; echo '</body></html>'; Session session_destroy(); Version exit; } ?> <p>Du hast noch <?php echo ($max_versuche - $versuche) ." "?> Versuche! </p> <?php $versuche++; $_SESSION['versuche'] = $versuche; ?> <form action="guess_session.php" method=POST> <p>Rate die Zahl zwischen 1 und <?php echo $max_zahl ?>:</p> <input type=text name="geraten"><br> <input type=submit value="Richtig?"> </form></body></html> EWS, WS 2015/16, Pfahler Q-15 Vergleich der Techniken zur Session-Verwaltung EWS, WS 2015/16, Pfahler Q-16
© Copyright 2024 ExpyDoc