Entwicklung - PHP - Zustands-basiertes Programm für ein Quiz oder eine Umfrage in PHP

PHP: Zustands-basiertes Programm für ein Quiz oder eine Umfrage in PHP

rob (53)

rob

12.08.2002 00:42

Vinn

  • 323 Postings, noch 27 bis zum nächsten Level (350)

Postings: 323

Zustands-basiertes Programm für ein Quiz oder eine Umfrage in PHP

Samstag, 14. August 2004 01:05

  • 0.0/6 Votes: 0
0.0/6 Votes: 0

dies soll eine Anleitung werden ein Script/Programm zu erstellen, mit dem man basierend auf Zustände z.B. eine Umfrage oder ein Quiz realisieren kann - Der aktuelle Zustand wird jeweils in der PHP-Session gespeichert.
Ein Problem oder besser gesagt das Ziel z.B. bei einem Quiz ist es ja zu verhindern das ein vorangegangener 'Zustand' - z.B. die Fragebeantwortung nicht nochmal aufgerufen werden kann - wäre bei einem Quiz auch nicht so gut, wenn ich eine Frage mehrmals beantworten kann.
Der Vorteil bei einem zustands-basierten Ablauf ist nun, dass jeder Zustand einen festgelegten Folgezustand hat und genau dieser Folgezustand wird dann beim nächsten Programmaufruf aufgerufen. Innerhalb der Zustände können dann bestimmte 'Reaktionen' z.B. auf Übergabeparameter definiert werden.

Für ein Quiz gäbe es in einem einfachen Beispiel z.B. die folgenden Zustände:
Start -> Zeigen einer Frage -> Kontrolle der Antwort -> Zeigen der Lösung -> Nächste Frage
-> Zeigen einer Frage -> Kontrolle der Antwort -> Zeigen der Lösung -> Nächste Frage .......
-> Zeigen eines Eingabeformulars(für Userdaten) -> Eintragung der Daten in eine Datenbank -> Ende

Und jetzt mal zum Programmablauf:
da der aktuelle Zustand immer in der Session gespeichert werden soll, muss natürlich auch zuerst die Session gestartet werden.
Um beim ersten Aufruf des Scriptes einen Startzustand zu erhalten, wird der Startzustand definiert, falls kein Zustand in der Session vorhanden ist.

session_start();
if(!$_SESSION['sState'])
$_SESSION['sState'] = 'init';

so, jetzt ist auf jeden Fall ein Zustand definiert und kann entsprechend verarbeitet werden - dazu genügt uns eine switch()-Verzweigung - in den einzelnen case-Fällen (Zuständen) kann nun der gewünschte Programmablauf definiert werden.

Wir fangen mal an mit dem Start, hier soll ein Startbildschirm oder Logo gezeigt werden mit einem Weiter-Button.

case 'init':
//hier den HTML-Code der Startseite ausgeben
$_SESSION['sState'] = "showquestion";
break;

beim nächsten Aufruf des Scriptes wird dann der nächste Zustand 'showquestion' aufgerufen und eine Frage gezeigt, die Punkte werden in der Session gespeichert, falls noch keine Punkte oder Rundenzahl vorhanden sind, werden Sie auf 0 gesetzt. Den HTML-Code der Seite kann man z.B. über Templates realisieren.

case 'showquestion':
$_SESSION['round']=$_SESSION['round']?$_SESSION['round']:0;
$_SESSION['punkte']=$_SESSION['punkte']?$_SESSION['punkte']:0;

//hier den HTML-Code der Frageseite ausgeben
$_SESSION['sState'] = "checkanswer";

break;

der nächste Zustand ist dann 'checkanswer', falls nur ein Reload der Seite gemacht wurde und keine Antwort gegeben wurde, wird wieder 'showquestion' als Folgezustand definiert und das Script neu aufgerufen.
Wenn eine Antwort vorhanden ist, wird kontrolliert ob die Frage richtig beantwortet wurde. Falls richtig beantwortet wurde, wird der Punktestand hochgezählt und die Sessionvariable 'antwort_korrekt' auf TRUE gesetzt, diese wird im nächsten Schritt benötigt um das Ergebnis anzuzeigen.
In der Funktion checkanswer() kann individuell z.B. in der Datenbank kontrolliert werden ob die Antwort richtig oder falsch ist.
Dann wird das Script neu aufgerufen - mit dem neuen Zustand 'showanswer'. Der Zustand 'checkanswer' wird also hier immer nur einmal aufgerufen - was ja auch berechtigt ist (ansonsten würde jedesmal der Punktestand hochgezählt). Jetzt sollte man auch verstehen warum die Kontrolle der Antwort und die Ausgabe der Antwort zwei verschiedene Zustände sein müssen.

case 'checkanswer':
if(!$_POST['MeineAntwort'])
{
$_SESSION['sState'] = "showquestion";
}
else
{
$_SESSION['antwort_korrekt'] = false;
if($_POST['Antwort'] == checkAnswer())
{
$_SESSION['punkte']++;
$_SESSION['antwort_korrekt'] = true;
}
$_SESSION['sState'] = "showanswer";
}
header('Location: '. $_SERVER['PHP_SELF']);
break;

die Antwort wurde kontrolliert und kann jetzt ausgegeben werden, um zur nächsten Frage zu kommen wird dann noch ein 'Weiter-Button' auf der Ausgabeseite eingebaut.

case 'showanswer':
//hier den HTML-Code der Antwortseite ausgeben
if($_SESSION['antwort_korrekt'])
//Ausgabe im HTML-Code, daß die Antwort korrekt war
else
//Ausgabe im HTML-Code, daß die Antwort nicht korrekt war
$nextState = "nextquestion";
break;

den Zustand 'nextquestion' benötigen wir, um eine Weiche bei einer bestimmten Rundenzahl zu haben.
Hier wird zuerst geprüft ob der Weiter-Button gedrückt wurde, wenn nur die Seite neu geladen wurde, heisst der Folgezustand wieder 'showanswer'. Ansonsten wird entweder als Folgezustand 'showquestion' oder 'showform' definiert - je nach Rundenzahl. Mit der header()-Funktion wird nun wieder die Seite neu geladen.

case 'nextquestion':
if($_GET['weiter'])
{
if( $_SESSION['round'] >= 10)
$_SESSION['sState'] = "showform";
else
{
$_SESSION['round']++;
$_SESSION['sState'] = "showquestion";
}
}
else
{
$_SESSION['sState'] = "showanswer";
}
header('Location: '. $_SERVER['PHP_SELF']);
break;

in den nächsten 9 Runden wiederholt sich der bisherigen Ablauf.
showquestion -> checkanswer -> showanswer -> nextquestion .....
bis zur 10. Runde (wenn dann endlich alle Fragen beantwortet sind), da kommt dann mal wieder was Neues: ein Folgezustand 'showform'.
Jetzt wird ein HTML-Formular gezeigt, in dem der User seine Angaben (Name, Email ...) machen kann. Bei Quiz kann es ja vielleicht was zu gewinnen geben - oder einfach nur eine Highscore-Liste geführt werden.
Als Folgezustand wird 'saveform' definiert.

case "showform":
//hier das HTML-Formular ausgeben
$nextState = "saveform";
break;

in unseren vorletzten Zustand 'saveform' können dann die Usereingaben und das Quiz-Ergebnis z.B. in eine Datenbank eingetragen werden. Es wird noch die Session-Varaible 'insert' gesetzt, damit bei einem Reload das Ergebnis nicht doppelt in die Datenbank geschrieben wird. Der letzte Folgezustand ist dann 'showfinish'.

case "saveform":
//hier die Daten in die Datenbank eintragen

$_SESSION['sState'] = "showfinish";
$_SESSION['insert'] = 1;
header('Location: '. $_SERVER['PHP_SELF']);
break;

jetzt aber der letzte Zustand im Quiz, einen Folgezustand gibt es nicht mehr.

case "showfinish":
//hier den HTML-Code der 'Danke'-Seite ausgeben
break;


das hier vorgestellte Script funktioniert so nur wenn eine Session vorhanden ist bzw. der User ein Session-Cookie zulässt.
Um diesen Fall zu berücksichtigen, muss man die Session-ID bei jedem Aufruf des Scriptes mit als Parameter übergeben z.B. als im Formular als hidden-Parameter oder bei den 'Weiter-Links' an die URL als GET-Parameter dranhängen. Die header-Funktion kann man abändern in header('Location: '. $_SERVER['PHP_SELF'] .'?SID='. session_id());.
Ganz wichtig ist dann auch das Setzen der Session-ID, dies dann muss vor session_start() geschehen.
session_id($SID);

das vorgestellte Script soll kein fertiges Quiz sein, sondern den Programm-Ablauf basierend auf Zustände vorstellen, aus diesem Grund wurde auch nicht näher auf die Ausgabe und Verabeitung von Daten eingegangen.


Download des kompletten Script hier.

Zuletzt editiert:Samstag, 14. August 2004 11:43
Bookmark setzen!:Zu Google Bookmark hinzufügen.Zu bloglines hinzufügen.Zu Newsgator hinzufügen.Zu FURL hinzufügen.Zu DIGG hinzufügen.Zu Webnews hinzufügen.Zu Netscape hinzufügen.Zu Yahoo MyWeb hinzufügen.Zu spurl.net hinzufügen.Zu diigo hinzufügen.Zu Newsvine hinzufügen.Zu del.icio.us hinzufügen.Zu SIMPIFY hinzufügen.Zu Mister Wong hinzufügen.Zu Linkarena hinzufügen.Zu isio.de hinzufügen.Zu Oneview hinzufügen.Zu yigg.de hinzufügen.Zu reddit hinzufügen.Zu StumbleUpon hinzufügen.Zu Slashdot hinzufügen.Zu Blinklist hinzufügen.Zu Technorati hinzufügen.Zu Blogmarks hinzufügen.Zu Blinkbits hinzufügen.Zu ma.gnolia hinzufügen.Zu smarking.com hinzufügen.Zu Netvouz hinzufügen.Zu co.mments hinzufügen.Zu Connotea hinzufügen.Zu de.lirio.us hinzufügen.

Specials

Bytefresser Specials: Anno 1404

Umfrage

Welches ist Dein Lieblings-Anno?

(17 Stimmen)

1. Ganz klar: Anno 1800!
2. Anno 2205
3. Anno 2070
4. Anno 1404
5. Anno 1701
6. Anno 1503
7. Anno 1602
8. Anno Online

Benutzer-Counter

Besucher gesamt: 1.160.049
Besucher heute: 68
Besucher gestern: 57
Max. Besucher/Tag: 900
Gerade online: 7
Max. online: 77
Seiten gesamt: 18.114.548
Aufrufe diese Seite: 578

Tag-Cloud

  august     runde     script     programm     aufruf     userdaten     email     zustand     jetzt     session     highscore-liste     umfrage     datenbank     folgezustand     php_self     antwort     samstag     nächste     bytefresser     eingabeformulars     kontrolle     entwicklung     zustands-basiertes     location     lösung     daten     html-formular     zeigen     postings     eintragung