Thomas D.: Fragenkatalog erstellen

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

  1. 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.

    --
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
    Wissen ist gut, Können ist besser, aber das Beste und Interessanteste ist der Weg dahin! (Detlef G.)
    1. 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.

      1. 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

        1. 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

        2. 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.

          --
          Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
          Man sollte nie aufhören zu fragen (Alber Einstein)
          ... aber natürlich erst, nachdem man sämliche FAQ's und Archive durchgelesen hat :-P
          1. 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

  2. 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

    1. 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

      1. 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.

        --
        Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
        Schon gewusst, dass Bugs und Feature Vorschläge für das CForum ins Entwicklerforum oder in den BugTracker gehören und nicht hier her?
        1. 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

          1. 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

      2. 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

        --
        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
        1. 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.

          --
          Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
          Das Leben ist kein Warenhaus - es nimmt nichts zurück. (Anette Louisan)