ews15-q-session - Universität Paderborn

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