PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Quiz Programmieren mit PHP


Seoman
13.05.2003, 15:44:28
Wie kann man den so ein Quiz wie hier http://www.barrowdowns.com/QuizD2.asp?Size=

mit php Programmieren, ich hab das mit If befehlen versucht, hab es aber nicht hingekriegt.

OvenFreshBread
13.05.2003, 15:54:30
Du brauchst eigentlich nur 2 seiten
Eine Seite mit den Fragen, das geht ja ganz einfach die den Radiobuttons, für jede frage nen namen wie frage1, oder so und dann jeder button nen wert 1, 2, 3, 4

und auf der nächsten Seite, der die variablen übergeben werden überprüfst du, ob die antworten richtig sind. Das geht ja mit der IF-abfrage

zb:
Frage 1:
Was ist rot?
1)nen auto
2)nen baum
3) ne farbe
4) nen grüner Apfel

if(antwort1=='3')
$richtig_antworten_zaehler++;

usw.

sourcecode
13.05.2003, 16:21:10
Es ist komplizierter. Zum Beispiel willst du doch sicher, dass die richtige Möglichkeit nicht immer variante A ist...da musst du noch mit Zufall arbeiten...bin gerade dabei, was auszuarbeiten (weil ich das irgendwie interessant finde)...könnte aber länger dauern...

Seoman
13.05.2003, 17:21:47
ja es soll nicht immer antwort 1 die Richtige sein, sonst ist das ziemlich leicht zu beantworten.

man könnte doch eine if schleife einbauen oder für jede Frage eine eigene If schleife ...

bin mal gespannt was du so machst.

MiH
13.05.2003, 17:38:10
das script ist etwas unglücklich, denn ein blick in den source zeigt dir die richtige antwort - wunderbar.

sowas zu programmieren ist einfach. du musst einfach nur dem formular ellement die einen namen geben und diesen dann vergleichen. ich habs mal mit einer db gemacht, da auch noch die userdaten gespeichetr werden sollten + gewinner 90 tage gespeichert werden.

so habe ich der frage ne id gegeben + die richtige antwort dahinter gehängt.
die tabelle sieht dann so aus:

quizid|frageid|antwort

danach kannst du mit mysql sehr schön selektieren. :)

sourcecode
13.05.2003, 18:24:36
Geht auch alles ohne MySQL, und stattdessen mit einfach zu handhabenden Text-Dateien
Geht auch alles ohne if-Abfrage und stattdessen mit Arrays

Die Fragen speicherst du in die Datei Fragen.txt, die Antworten speicherst du in die Datei Antworten.txt, und für die falschen Antwortmöglichkeiten speicherst du die erste falsche Antwort jeder Frage in die Datei Falsche_1.txt, die zweite in Falsche_2.txt und die dritte in Falsche_3.txt

Jede Frage bzw. Antwort(möglichkeit) mit genau einer Zeile. (Auch nach letzter Frage ein Zeilenumbruch)

Dann kannst mit dem Befehl file() die Dateien in Arrays einlesen,
als Argument zu übergeben ist der Dateiname.

also:

$Fragen = file("Fragen.txt");
$Antworten = file("Antworten.txt");
$Falsche_1 = file("Falsch_1.txt");
$Falsche_2 = file("Falsch_2.txt");
$Falsche_3 = file("Falsch_3.txt");

Du legst in der Variable $Fragenanzahl die Anzahl an Fragen fest, die angezeigt werden soll. Sollen alle vorhandenen Fragen angezeigt werden, so notierst du:

$Fragenanzahl = count($Fragen);

(Foreach, womit du Arrays durchlaufen kannst, kannst du in diesem Fall nicht verwenden, da du auch mit dem numerischen Index auf die anderen Arrays zugreifen musst, es sei denn, du verwendest ein multidimensionales Array)

Nun werden über eine for-Schleife die Fragen mit den Antwortmöglichkeiten dargestellt.

Nun soll natürlich nicht immer unbedingt Antwort A die richtige sein, deshalb solltest du das ganze dann noch mit einer Zufallsfunktion kombinieren. Von der aktuellen Frage werden die Frage und Antwortmöglichkeiten in ein temporäres Array gepackt. Aus diesem Array wird zufällig ein Wert gezogen. Dieser darf jedoch dann nicht nochmal gezogen werden und wird deshalb mit dem Befehl unset aus dem Array gefiltert, anschließend wird das Array mit dem Befehl array_values gepackt (damit im numerischen Index keine Lücken sind).

Außerdem das ganze noch mit HTML umschmücken.
Hier ist dann das komplette Skript, welches die Frage nennt und die Antwortmöglichkeiten in zufälliger Reihenfolge auflistet.
Speicher das Skript als Quiz.php, wenn du die Auswertung auf der gleichen Seite haben willst.

<?
// Skript legt die Dateien Fragen.txt, Antworten.txt, Falsche_1.txt, Falsche_2.txt und Falsche_3.txt in ein Array
// Es wird zuerst die Frage ausgegeben, und dann in zufälliger Reihenfolge die 4 Antwortmöglichkeiten inklusive der richtigen Antwort
// Skript ist auf genau 4 Antwortmöglichkeiten festgesetzt, bei dynamischer Anzahl der Antwortmöglichkeiten müsste es anders aufgebaut sein
$Fragen = file("Fragen.txt");
$Antworten = file("Antworten.txt");
$Falsche_1 = file("Falsche_1.txt");
$Falsche_2 = file("Falsche_2.txt");
$Falsche_3 = file("Falsche_3.txt");
$Fragen = str_replace("rn","",$Fragen);
$Antworten = str_replace("rn","",$Antworten);
$Falsche_1 = str_replace("rn","",$Falsche_1);
$Falsche_2 = str_replace("rn","",$Falsche_2);
$Falsche_3 = str_replace("rn","",$Falsche_3);
$Fragenanzahl = count($Fragen);
echo "<html><head><title>Quiz mit vorgegebenen Antwortmöglichkeiten</title></head><body>n";
echo "<form name="Formular" action="Quiz.php" method=post target=_self>n";
for ($Nummer = 0; $Nummer < $Fragenanzahl; $Nummer += 0) {
$Frage = $Fragen[$Nummer];
$Antwort = $Antworten[$Nummer];
$Falsch_1 = $Falsche_1[$Nummer];
$Falsch_2 = $Falsche_2[$Nummer];
$Falsch_3 = $Falsche_3[$Nummer];

$Möglichkeiten = array($Antwort,$Falsch_1,$Falsch_2,$Falsch_3);
srand((double)microtime() * 1000000);
$Zufall = rand(0,3);
$Antwort_A = $Möglichkeiten[$Zufall];
$Antwort_A = htmlentities($Antwort_A);

unset($Möglichkeiten[$Zufall]);
$Möglichkeiten = array_values($Möglichkeiten);
srand((double)microtime() * 1000000);
$Zufall = rand(0,2);
$Antwort_B = $Möglichkeiten[$Zufall];
$Antwort_B = htmlentities($Antwort_B);

unset($Möglichkeiten[$Zufall]);
$Möglichkeiten = array_values($Möglichkeiten);
srand((double)microtime() * 1000000);
$Zufall = rand(0,1);
$Antwort_C = $Möglichkeiten[$Zufall];
$Antwort_C = htmlentities($Antwort_C);

unset($Möglichkeiten[$Zufall]);
$Möglichkeiten = array_values($Möglichkeiten);
$Antwort_D = $Möglichkeiten[0];
$Antwort_D = htmlentities($Antwort_D);

$Nummer++;
echo "<p>Frage $Nummer von $Fragenanzahl: $Frage<br>n";
echo "<input type=radio name="Antwort_$Nummer" value="$Antwort_A">$Antwort_A<br>n";
echo "<input type=radio name="Antwort_$Nummer" value="$Antwort_B">$Antwort_B<br>n";
echo "<input type=radio name="Antwort_$Nummer" value="$Antwort_C">$Antwort_C<br>n";
echo "<input type=radio name="Antwort_$Nummer" value="$Antwort_D">$Antwort_D</p>n";
}

$Richtige_Fragen = 0;
$Nummern_der_richtigen_Fragen = array();
for ($Nummer = 1; $Nummer <= $Fragenanzahl; $Nummer++) {
$Richtig = $Antworten[($Nummer-1)];
$Antwort = $HTTP_POST_VARS["Antwort_$Nummer"];
if ($Antwort == $Richtig) {
$Richtige_Fragen++;
$Nummern_der_richtigen_Fragen[] = $Nummer;
}}
$Nummern_der_richtigen_Fragen = implode($Nummern_der_richtigen_Fragen,",");
echo "Du hast die Fragen $Nummern_der_richtigen_Fragen (insgesamt $Richtige_Fragen) richtig beantwortet !";
echo "<input type=submit value="Antworten auswerten"></form></body></html>";
?>

Kleine Anmerkung zu dem Skript:
Die Leerzeilen dazwischen dienen der Übersichtlichkeit. Sie trennen, wo das Array ein Element verliert.

Und am Ende des Skripts ist die Auswertung bereits enthalten:
Du prüfst mit einer Schleife, ob der vom User gepostete Wert für jede Frage mit dem entsprechenden Element im Antwort-Array identisch ist.

sourcecode
13.05.2003, 18:29:58
Achso, nun könntest du natürlich unterschiedlich schwere Fragen mit unterschiedlicher Punkteanzahl stellen, also brauchst du noch eine Datei Punkte.txt, wobei die Punkteanzahl jeder Frage wieder in einer einzelnen Zeile steht, dann kannst du das Auswertungsskript so erweitern:

$Richtige_Fragen = 0;
$Punkte = 0;
$Punkteliste = file("Punkte.txt");
$Punkteliste = str_replace("r","",$Punkteliste);
$Punkteliste = str_replace("n","",$Punkteliste);
for ($Nummer = 0; $Nummer < $Fragenanzahl; $Nummer++) {
$Richtig = $Antworten[$Nummer];
$Antwort = $HTTP_POST_VARS["Antwort_$Nummer"];
if ($Antwort == $Richtig) {
$Richtige_Fragen++;
$Punkte += $Punkteliste[$Nummer];
}}
echo "Du hast $Richtige_Fragen richtig beantwortet und somit $Punkte Punkte erzielt !";

Anmerkung: Ich verwende register_globals off in der php.ini
Deshalb sind die vom User übertragenen Antworten über das Array $HTTP_POST_VARS zu finden, entsprechend muss im Form-Tag dann natürlich method=post angegeben werden

Seoman
14.05.2003, 07:46:55
Ihr seit aber fleißig, die Möglichkeiten werden ich mir mal genauer unter die Lupe nehmen und umsetzen.

Vielen Dank

mfg
Seoman

Seoman
14.05.2003, 16:07:16
leider tauchen ein paar Fehler auf ...

zwischen den Fragen kommt immer das

Array enthält 4 Elemente.Array enthält 3 Elemente.Array enthält 2 Elemente.Array enthält 1 Elemente

und wenn ich aktualisiere, verschwinden manchmal ein paar Antwort möglichkeiten, also die richtige Antwort ist noch da nur ein oder zwei Falsche sind dann nicht mehr da.

sourcecode
14.05.2003, 16:46:00
leider tauchen ein paar Fehler auf ...

zwischen den Fragen kommt immer das

Array enthält 4 Elemente.Array enthält 3 Elemente.Array enthält 2 Elemente.Array enthält 1 Elemente

Ja, das hatte ich zur Kontrolle mit eingebaut, ob die Funktion unset ordentlich arbeitet, ich hatte es vorhin bereits wieder rausgenommen, und insgesammt den Beitrag nochmal überarbeitet. Also bitte nochmal anschauen, jetzt sollte es ordentlich funktionieren. Werd ihn vielleicht sogar nochmal verbessern - den Code zur Auswertung dazwischen packen.

und wenn ich aktualisiere, verschwinden manchmal ein paar Antwort möglichkeiten, also die richtige Antwort ist noch da nur ein oder zwei Falsche sind dann nicht mehr da.

Du hattest vermutlich noch die Version ohne die Zeile:

$Möglichkeiten = array_values($Möglichkeiten);

Deshalb fielen dort ein paar Antworten raus (weil es Lücken im Array gab. Habe nicht bedacht, das unset lediglich den Wert vom angegebenen numerischen Index löscht, ohne die anderen nachzurücken)

Seoman
14.05.2003, 17:03:22
so sieht jetzt meine Quiz.php aus

<?



// Skript legt die Dateien Fragen.txt, Antworten.txt, Falsche_1.txt, Falsche_2.txt und Falsche_3.txt in ein Array
// Es wird zuerst die Frage ausgegeben, und dann in zufälliger Reihenfolge die 4 Antwortmöglichkeiten inklusive der richtigen Antwort
// Skript ist auf genau 4 Antwortmöglichkeiten festgesetzt, bei dynamischer Anzahl der Antwortmöglichkeiten müsste es noch anders aufgebaut sein
$Fragen = file("Fragen.txt");
$Antworten = file("Antworten.txt");
$Falsche_1 = file("Falsche_1.txt");
$Falsche_2 = file("Falsche_2.txt");
$Falsche_3 = file("Falsche_3.txt");
$Fragen = str_replace("rn","",$Fragen);
$Antworten = str_replace("rn","",$Antworten);
$Falsche_1 = str_replace("rn","",$Falsche_1);
$Falsche_2 = str_replace("rn","",$Falsche_2);
$Falsche_3 = str_replace("rn","",$Falsche_3);
$Fragenanzahl = count($Fragen);
echo "<html><head><title>Quiz mit vorgegebenen Antwortmöglichkeiten</title></head><body>n";
echo "<form name="Formular" action="Quiz.php" method=post target=_self>n";
for ($Nummer = 0; $Nummer < $Fragenanzahl; $Nummer += 0) {
$Frage = $Fragen[$Nummer];
$Antwort = $Antworten[$Nummer];
$Falsch_1 = $Falsche_1[$Nummer];
$Falsch_2 = $Falsche_2[$Nummer];
$Falsch_3 = $Falsche_3[$Nummer];

$Möglichkeiten = array($Antwort,$Falsch_1,$Falsch_2,$Falsch_3);
srand((double)microtime() * 1000000);
$Zufall = rand(0,3);
$Antwort_A = $Möglichkeiten[$Zufall];

unset($Möglichkeiten[$Zufall]);
$Möglichkeiten = array_values($Möglichkeiten);
srand((double)microtime() * 1000000);
$Zufall = rand(0,2);
$Antwort_B = $Möglichkeiten[$Zufall];

unset($Möglichkeiten[$Zufall]);
$Möglichkeiten = array_values($Möglichkeiten);
srand((double)microtime() * 1000000);
$Zufall = rand(0,1);
$Antwort_C = $Möglichkeiten[$Zufall];

unset($Möglichkeiten[$Zufall]);
$Möglichkeiten = array_values($Möglichkeiten);
$Antwort_D = $Möglichkeiten[0];

$Nummer++;
echo "<p>Frage $Nummer von $Fragenanzahl: $Frage<br>n";
echo "<input type=radio name="Antwort_$Nummer" value="$Antwort_A">$Antwort_A<br>n";
echo "<input type=radio name="Antwort_$Nummer" value="$Antwort_B">$Antwort_B<br>n";
echo "<input type=radio name="Antwort_$Nummer" value="$Antwort_C">$Antwort_C<br>n";
echo "<input type=radio name="Antwort_$Nummer" value="$Antwort_D">$Antwort_D</p>n";
}
echo "<input type=submit value="Antworten auswerten"></form></body></html>";

$Richtige_Fragen = 0;
for ($Nummer = 0; $Nummer < $Fragenanzahl; $Nummer++) {
$Richtig = $Antworten[$Nummer];
$Antwort = $HTTP_POST_VARS["Antwort_$Nummer"];
if ($Antwort == $Richtig) {
$Richtige_Fragen++;
}}
echo "Du hast $Richtige_Fragen richtig beantwortet !";

?>

leider wertet er die Frage nicht aus, es steht immer nur das du hast null antworten richtig.

sourcecode
14.05.2003, 17:10:49
Ich vermute, dass die Variablen nicht übertragen werden.
Hast du deinen eigenen Server oder bist du bei einem Provider ?
Was ist in der php.ini bei register_globals eingestellt ?
(Verwende den Befehl phpinfo() bei einem Provider)

In anderer PHP-Version werden die geposteten Variablen auch so angesprochen, glaube ich:

$_POST["Antwort_$Nummer"];

Zur Überprüfung solltest du dir auch mal eine der geposteten Antworten versuchen, anzeigen zu lassen, um auszuschließen, ob der Fehler direkt vom Skript stammt. Ansonsten sind eben die Einstellungen falsch.

Ach nochwas: Üblicherweise steht nach </body></html> nichts mehr, also setz die Auswertung davor.

Seoman
14.05.2003, 17:12:10
Ich hab einen Apache den verwende ich offline

die register_globals sind ON

sourcecode
14.05.2003, 17:59:19
Hab Fehler bei der Auswertung korrgiert und nochmal getestet, bei mir funktioniert es jetzt. Habs oben nochmal geändert (allerdings noch ohne Punkte-Auswertung)

Seoman
14.05.2003, 18:03:27
jetzt funktioniert es auch bei mir vielen Dank für die Mühen...

ich komme bald wieder mit Fragen für ein anderes Script

Seoman
14.05.2003, 18:56:24
Also ich hätte noch ein paar Vorschläge Fragen für das Script:


wenn man das mit den Punkten macht, könnte man doch dann eine Seite machen wo der Namen der User steht die mitgemacht haben und wer die meisten Punkte hat ...

und das er ausgibt welche Fragen beim Quiz falsch waren und dazu die Richtige antwort ...

sourcecode
14.05.2003, 19:34:19
Habe noch Nummern der Fragen zugefügt, die richtig beantwortet wurden. Ansonsten: Viel Spaß beim Weiterentwickeln !