Fragenkatalog erstellen
Thomas D.
- php
0 Dennis0 Thomas D.0 Vinzenz Mai
0 Karl-Heinz Osmer
Hallo Ihr lieben dort draussen.
Ich bin dabei meine Lizenz zum Fallschirmspringen zu machen und wollte mir mit php ein kleines Progrämmchen schreiben in dem ich meine Testfragen eingeben kann um damit zu üben.
Vorgestellt hab ich mir das so
Es kommt die erste Frage mit 4 Antworten zum anklicken und der Rechner wertet dann aus ob die Antwort richtig war und ganz zum Schluss (nach 85 Fragen) wertet er aus wieviel richtig und wieviel falsch waren.
Problem ist ehrlich gesagt, ich weiss überhaupt nicht wie ich das anfangen soll.
Bräuchte da mal ein paar Tips.
Gruss Thomas
Hi Thomas,
Problem ist ehrlich gesagt, ich weiss überhaupt nicht wie ich das anfangen soll.
Sicherlich gibt es auch bei diesem „Problem” mal wieder zig viele verschiedene Möglichkeiten, wie man das angehen könnte.
Ich würde es ungefähr so machen:
MySQL Tabelle erzeugen, erste Spalte die Frage, dann vier Spalten für die vier Antwortmöglichkeiten und schließlich noch eine sechste Spalte mit der richtigen Antwort.
Ach ja, eine Spalte mit einer ID brauchen wir bestimmt auch noch.
Dann würde ich die Information, welche Antwort der User ausgewählt hat in Sessions speichern.
Was bräuchte man noch? Einen Algorithmus, um immer an die nächste Frage zu kommen. Dazu würde ich immer die ID der alten Frage mit weiterübergeben, dann solltest du so an die nächste Frage drankommen:
SELECT
id, frage, antwort_a, antwort_b, antwort_c, antwort_d, richtige_loesung
FROM
fragenkatalog
WHERE
id > $_GET['vorherige_id']
LIMIT 1
Nur mal so ein grobes Brain-Storming, nicht sortiert oder strukturiert ;-) Ich hoffe, ich konnte helfen.
MfG, Dennis.
Hi Dennis
Das Problem mit SQL zu lösen ist schon interessant.
Ich hab da aber als richtige Antworten zum Beispiel dabei.
a) Antworten 1 und 2 sind richtig
b) Antworten 1,2 und 4 sind richtig
c) Antwort 3 ist richtig
d) Alle Antworten sind richtig.
Hiesse doch im Klartext ich bräuchte id, Frage, antwort_a,antwort_b,antwort_c,antwort_d,lösung_a,lösung_b,lösung_c,lösung_d
Andere Fragen haben nur einfach 4 Antworten wo es nur eine Lösung gibt.
Alle Fragen haben immer nur eine richtige Antwort.
Hallo Thomas
Ich hab da aber als richtige Antworten zum Beispiel dabei.
Deswegen ist es gut, solche Randbedingungen gleich zu posten.
a) Antworten 1 und 2 sind richtig
b) Antworten 1,2 und 4 sind richtig
c) Antwort 3 ist richtig
d) Alle Antworten sind richtig.Hiesse doch im Klartext ich bräuchte id, Frage, antwort_a,antwort_b,antwort_c,antwort_d,lösung_a,lösung_b,lösung_c,lösung_d
Und das würde den schlechten Designvorschlag (sorry, Dennis) noch verschlimmern.
Andere Fragen haben nur einfach 4 Antworten wo es nur eine Lösung gibt.
Alle Fragen haben immer nur eine richtige Antwort.
Dennis DB ist zu einfach und deswegen zu kompliziert. Es ist viel einfacher, mehr als eine Tabelle zu verwenden:
1. Tabelle Fragen
f_id, f_nr, frage
2. Tabelle Antworten
a_id, a_nr, f_id, antwort, loesung
Für jede Antwort zu einer Frage gibt es einen entsprechenden Datensatz in der Tabelle Antworten. Die Verknüpfung erfolgt über die f_id, in antwort steht der Text, in loesung der boolsche Wert true, falls es eine Lösung ist bzw. false im anderen Fall.
Mit diesem Ansatz ist es übrigens problemlos möglich, eine beliebige Anzahl von Antworten zu einer Frage zu haben und genauso eine beliebige Anzahl von richtigen Antworten. Ist also viel flexibler.
Auf die künstlichen Spalten für den Primärschlüssel könntest Du verzichten. Meiner Meinung nach sollte jedoch die Schlüsselspalte nicht für weitere Informationen missbraucht werden.
Freundliche Grüße
Vinzenz
Hey Vinzenz
Jaaaa, das gefällt mir besser und lässt sich hinterher auch super miteinander verknüpfen.
Der Ansatz wäre somit geschafft, jetzt gehts an die Skripte.
Lässt es sich denn so realisieren das ich radio buttons vor die Antworten stellen kann um diese dann per id an die Datenbank zu übergeben ?
LG Thomas
Hi Vinzenz,
Und das würde den schlechten Designvorschlag (sorry, Dennis) noch verschlimmern.
Dennis DB ist zu einfach und deswegen zu kompliziert.
Für den nachträglich von Thomas gegebenen Fall, dass es mehrere richtige Antworten geben soll, stimme ich dir da zu, da ist es wirklich praktischer, komfortabler und in gewissem Grade auch einfacher, zwei Tabellen zu verwenden.
Was aber den im Ausgangsposting vermuteten Fall angeht, finde ich so ein System mit zwei Tabellen überdimenstioniert - wenn es immer gleich viele Antworten und nur eine Richtige gibt, ist eine Tabelle imho übersichtlicher und handlicher.
Für jede Antwort zu einer Frage gibt es einen entsprechenden Datensatz in der Tabelle Antworten. Die Verknüpfung erfolgt über die f_id, in antwort steht der Text, in loesung der boolsche Wert true, falls es eine Lösung ist bzw. false im anderen Fall.
Dies ist für ein unbegrenzte-Antworten-ungegrenzte-Richtige Prinzip in der Tat der beste Weg - auch wenn man für ein paar Spalten vielleicht beim Spaltennamen nicht ganz so faul sein muss und ihn etwas aussagekräftiger gestalten kann :-P
MfG, Dennis.
Hallo Dennis
Was aber den im Ausgangsposting vermuteten Fall angeht, finde ich so ein System mit zwei Tabellen überdimenstioniert - wenn es immer gleich viele Antworten und nur eine Richtige gibt, ist eine Tabelle imho übersichtlicher und handlicher.
Nö, auch da sind zwei Tabellen einfacher und handlicher. Der Vergleich, welche Antwort richtig ist, ist viel einfacher :-)
WHERE loesung = TRUE (MySQL 4.1 und höher :-)
und für das DBMS einfacher.
Wie sieht Deine Lösung aus?
Dies ist für ein unbegrenzte-Antworten-ungegrenzte-Richtige Prinzip in der Tat der beste Weg - auch wenn man für ein paar Spalten vielleicht beim Spaltennamen nicht ganz so faul sein muss und ihn etwas aussagekräftiger gestalten kann :-P
fragen_nr und antwort_nr?
fragen_nummer und antwort_nummer?
Von mir aus. *g*
Freundliche Grüße
Vinzenz
Hallo, Thomas,
Problem ist ehrlich gesagt, ich weiss überhaupt nicht wie ich das anfangen soll.
Ich würde mit einer programminternen Tabelle der Fragen und ihrer vier Antworten anfangen:
$test = array (
array("frage1", "antwort1_1", "antwort1_2", "antwort1_3" )
,array("frage2", "antwort2_1", "antwort2_2", "antwort2_3" )
,array("frage3", "antwort3_1", "antwort3_2", "antwort3_3" )
)"
LG Kalle
Hey Kalle
Das ist aber keine Datenbank Lösung oder ?
Hallo, Thomas,
Problem ist ehrlich gesagt, ich weiss überhaupt nicht wie ich das anfangen soll.
Ich würde mit einer programminternen Tabelle der Fragen und ihrer vier Antworten anfangen:
$test = array (
array("frage1", "antwort1_1", "antwort1_2", "antwort1_3" )
,array("frage2", "antwort2_1", "antwort2_2", "antwort2_3" )
,array("frage3", "antwort3_1", "antwort3_2", "antwort3_3" )
)"LG Kalle
Hi Thomas,
Das ist aber keine Datenbank Lösung oder ?
Nein, und ich sehe da auch noch nirgendwo die Information hinterlegt, welche Antworten richtig sind.
MfG, Dennis.
Hallo Dennis
Das ist aber keine Datenbank Lösung oder ?
Du hattest nicht explizit nach einer Datenbanklösung gefragt.
Nein, und ich sehe da auch noch nirgendwo die Information hinterlegt, welche Antworten richtig sind.
Dennoch ist eine Datenbank für diese simple Aufgabe nicht erforderlich und Kalles Ansatz müsste nur entsprechend ausgearbeitet werden. Ein Array mit Arrays als Array-Einträgen bietet sich da schon an. Überlegt Euch doch die notwendige Struktur.
Mit Textdateien ginge das bestimmt auch, das INI-File-Format würde sich z.B. anbieten.
Freundliche Grüße
Vinzenz
Hallo,
Das ist aber keine Datenbank Lösung oder ?
Du hattest nicht explizit nach einer Datenbanklösung gefragt.
Nein, und ich sehe da auch noch nirgendwo die Information hinterlegt, welche Antworten richtig sind.
Es war ja nur nach der Startidee gefragt.
Ich würde im Array immer Antwort 1 als richtige Antwort speichern. Die Anzeige der Reihenfolge muss dann mit dem Zufallsgenerator erfolgen.
LG Kalle
Hi,
Das ist aber keine Datenbank Lösung oder ?
Ist IMHO machbar, aber nicht notwendig. Ich habe mich diesbezügl. für XML entschieden. Beispiel:
<query domain="Sport">
<question>Wann fanden in Deutschland Olympische Sommerspiele statt?</question>
<answer>1924</answer>
<answer correct="true">1936</answer>
<answer>1956</answer>
<answer correct="true">1972</answer>
<explanation>1936 in Berlin und 1972 in München.</explanation>
</query>
In weiteren Attributen (falls einheitlich ggf. in einem übergeordneten Element) wären dann Punktezahl etc. zu definieren.
Gruß, Cybaer
Hi Cybaer,
Ist IMHO machbar, aber nicht notwendig. Ich habe mich diesbezügl. für XML entschieden. Beispiel:
[...]
Das sieht ganz nett aus ;-)
So etwas wollte ich auch schon immer mal ausprobieren, allerdings bin ich bis jetzt (mal abgesehen von Zeit-Gründen) immer davor abgeschreckt, mir die dazu nötigen XML Funktionen in PHP zu Gemüte zu führen *g*
MfG, Dennis.