Datenbanktabelle als zweidimensionales Array ausgeben
maddinyo
- php
0 suit0 Frank (no reg)0 suit0 EKKi- datenbank
0 maddinyo0 EKKi
Hallo
Ich arbeite gerade an meiner ersten Seite, die ich mit einer MySQL-Datenbank mache.
Es soll eine Quiz-Seite sein, wo Leute die Fragen und Antwortmöglichkeiten für ein Quiz eingeben können und dieses Quiz soll dann mit Auswertung, wieviele Fragen richtig beantwortet wurden, auf der Seite verfügbar sein.
Dafür habe ich eine MySQL-Datenbank namens Quiz erstellt, und darin eine Tabelle mit dem Namen Musik. Diese sieht nun vom Schema her so aus:
fragenr| frage | rantwort | fantwort1 | fantwort2
01 |Wie heißt...|Stadtaffe | Next! | Landaffe
02 |Wer kompo...| Haydn | Bach | Mozart
und so weiter, ich habe 10 Fragen. Hier steht rantwort für richtige Antwort und fantwort für falsche Antwort. Wie kann ich nun erreichen, dass die Datenbanktabelle für mich als zweidimensionales Array dieser Form verfügbar ist:
$frage[0][0] = "01";
$frage[0][1] = "Wie heißt...";
$frage[0][2] = "Stadtaffe";
$frage[0][3] = "Next!";
$frage[0][4] = "Landaffe";
$frage[1][0] = "02";
$frage[1][1] = "Wer kompo...";
$frage[1][2] = "Haydn";
$frage[1][3] = "Bach";
$frage[1][4] = "Mozart";
usw.
Wichtig dabei ist mir, dass die Array-Indexe nach fragenr geordnet sind und in der Datenbanktabelle beliebig viele Spalten für falsche Antworten stehen können.
Ich würde mich über eine schnelle und hilfreiche Antwort freuen.
mfg
Maddin-yo
Dafür habe ich eine MySQL-Datenbank namens Quiz erstellt, und darin eine Tabelle mit dem Namen Musik. Diese sieht nun vom Schema her so aus:
auf die gefahr hin, dass ich mich jetzt unbeliebt mache: aber "dein datenbankdesign ist scheisse"
fragenr| frage | rantwort | fantwort1 | fantwort2
01 |Wie heißt...|Stadtaffe | Next! | Landaffe
02 |Wer kompo...| Haydn | Bach | Mozartund so weiter, ich habe 10 Fragen. Hier steht rantwort für richtige Antwort und fantwort für falsche Antwort. Wie kann ich nun erreichen, dass die Datenbanktabelle für mich als zweidimensionales Array dieser Form verfügbar ist:
$frage[0][0] = "01";
$frage[0][1] = "Wie heißt...";
$frage[0][2] = "Stadtaffe";
$frage[0][3] = "Next!";
$frage[0][4] = "Landaffe";
$frage[1][0] = "02";
$frage[1][1] = "Wer kompo...";
$frage[1][2] = "Haydn";
$frage[1][3] = "Bach";
$frage[1][4] = "Mozart";
das design dieses arrays ist mindestens so suboptimal, wie die datenbank
Wichtig dabei ist mir, dass die Array-Indexe nach fragenr geordnet sind und in der Datenbanktabelle beliebig viele Spalten für falsche Antworten stehen können.
informiere dich über "normalisierung" einer datenbank, wenn du das geschafft hast (und die antworten von den fragen entkoppelt hast), kannst du dir gedanken über ein sinnvolles array machen
Hi,
wie schon überspitzt von jemand bemerkt, dein Design/Modell ist nicht wirklich toll.
Gegenfrage(n):
Warum willst du falsche Antworten speichern? Weil's Multiple-Choice Fragen sein sollen?
Warum muss das ganze in einem 2-dimensionalen Array landen? Zum Schleifchen machen?
beliebig viele Spalten für falsche Antworten
Genau hier solltest du merken, dass "beliebig viele" und "Spalten" nicht so wirklich zusammenpassen.
Mach doch mal 2 Tabellen draus: FrageTabelle (Id, Frage) und AntwortTabelle (Id, FrageId, Antwort, IstRichtig)
Für die FrageTabelle machst du eine Abfrage "SELECT Id, Frage FROM FrageTabelle ORDER BY Id" und während du die Datensätze dafür iterierst, feuerst du eine 2. Abfrage à la "SELECT Id, Antwort, IsRichtig FROM AntwortTabelle WHERE FrageId=#deineIdAusDerAnderenTabelle#"
Da ist es dann völlig schnurz, wieviele falsche und richtige Antworten zu einer Frage gehören.
Ciao, Frank
Da ist es dann völlig schnurz, wieviele falsche und richtige Antworten zu einer Frage gehören.
und auch die reihenfolge ist dann egal, die kann zufällig sein (was sogar besser ist, um "abschreiben" zu minimieren)
Mahlzeit Frank (no reg),
Für die FrageTabelle machst du eine Abfrage "SELECT Id, Frage FROM FrageTabelle ORDER BY Id" und während du die Datensätze dafür iterierst, feuerst du eine 2. Abfrage à la "SELECT Id, Antwort, IsRichtig FROM AntwortTabelle WHERE FrageId=#deineIdAusDerAnderenTabelle#"
Suboptimal. Ich würde die Antworttabelle zur Fragentabelle dazujoinen ... dann reicht eine Abfrage.
MfG,
EKKi
Hi Frank
Die beiden Vermutungen bei den Gegenfragen von dir waren beide richtig. Ich habe das Quiz jetzt einfach mal bei piranho online gestellt: http://maddin-yo.piranho.de/
Dort siehst du, was ich mir so vorstelle. Ich möchte das nun eben so machen, dass es über Datenbanken geregelt wird, damit Benutzer auch eigene Quizze einstellen können.(Dafür möchte ich später natürlich noch ein Menü einfügen, wo alle Quizze zu sehen sind und die Option, ein eigenez Quiz einzustellen) Da ich möchte, dass es beliebig viele Fragen sein können, die ein Benutzer reinstellt, dachte ich mir, das Schleifen dazu ziemlich optimal sind. Ich habe dann erst einmal ohne Datenbank ein Array erstellt, welches ich später aus einer Datenbank holen würde, und habe eine Funktion gemacht, die dieses zweidimensionale Array mit Hilfe von Schleifen so darstellt, wie ich es haben möchte:
$frage[0][0] = "0Wie heißt Peter Fox' erstes Soloalbum?";
$frage[0][1] = "1Stadtaffe@/@";
$frage[0][2] = "1Next!";
$frage[0][3] = "1Landaffe";
$frage[1][0] = "0Wer komponierte die "Sinfonie mit dem Paukenschlag"?";
$frage[1][1] = "1Joseph Haydn@/@";
$frage[1][2] = "1Johann Sebastian Bach";
$frage[1][3] = "1Wolfgang Amadeus Mozart";
$frage[2][0] = "0Wann kam Madsens Album "Frieden im Krieg" heraus?";
$frage[2][1] = "12008@/@";
$frage[2][2] = "12007";
$frage[2][3] = "12006";
$frage[3][0] = "0Von welcher Band ist "Smells like teen spirit"?";
$frage[3][1] = "1Nirvana@/@";
$frage[3][2] = "1The Bloodhound Gang";
$frage[3][3] = "1Linkin Park";
$frage[4][0] = "0In welchem Takt wird Walzer gespielt?";
$frage[4][1] = "13/4@/@";
$frage[4][2] = "14/4";
$frage[4][3] = "19/8";
$frage[5][0] = "0In welchem Jahr fand zum ersten Mal das Woodstock-Festival statt?";
$frage[5][1] = "11969@/@";
$frage[5][2] = "11968";
$frage[5][3] = "11967";
$frage[6][0] = "0In welchem Land ist die Oper entstanden?";
$frage[6][1] = "1Italien@/@";
$frage[6][2] = "1Frankreich";
$frage[6][3] = "1Deutschland";
$frage[7][0] = "0Wieviele Studioalben nahmen die Beatles auf?";
$frage[7][1] = "112@/@";
$frage[7][2] = "111";
$frage[7][3] = "113";
$frage[8][0] = "0In welcher Casting-Band sang Robbie Williams?";
$frage[8][1] = "1Take That@/@";
$frage[8][2] = "1N'Sync";
$frage[8][3] = "1US5";
$frage[9][0] = "0Wieviele Halbstonschritte enthält eine Oktave?";
$frage[9][1] = "112@/@";
$frage[9][2] = "18";
$frage[9][3] = "116";
/* Nullen und Einsen für späteres sort(); @/@ für die richtige Antwort */
function showquiz($frage) {
echo "<form method="post" action="auswertung.php" ><ol>";
for($i = 0; $i < count($frage); $i++){
sort($frage[$i]);
echo "<li><select name="$i" ><option value="none">--Bitte auswählen--</option>";
foreach($frage[$i] as $key => $value) {
if($key == 0){
continue;
}
echo "<option value="";
if(strpos($frage[$i][$key], "@/@") === false){
echo "0";
}
else {
echo "1";
}
echo "" >" .str_replace("@/@", "", substr($frage[$i][$key], 1, (strlen($frage[$i][$key]) - 1))). "</option>";
}
echo "</select>" .substr($frage[$i][0], 1, (strlen($frage[$i][0]) - 1)). "</li>";
}
echo "</ol>\r\n";
echo "<span id="auswertung" ><input type="Submit" name="submit" value="Auswertung" ></span></form>";
}
showquiz($frage);
Das sort() habe ich eingeführt, damit die richtige Antwort nicht immer an erster Stelle steht. Dann musste ich allerdings noch sicherstellen, das die Frage dennoch an richtiger Stelle steht, wofür ich die Nullen und Einsen an den Anfang stellte. Die Zeichenkette @/@, die ich so gewählt habe, weil sie vergelichsweise kurz ist und sie wahrscheinlich kein Benutzer in einer Antwortmöglichkeit so darstellen möchte, markiert, wie schon kommentiert, die richtige Antwort, die ich später für die Auswertung brauche, denn so konnte ich mit der if-abfrage (if(strpos($frage[$i][$key], "@/@") === false){echo "0";}else {echo "1";}) einen value für die option definieren.
Der nächste Schritt sollte dann sein, das Ganze in eine Datenbanktabelle zu packen, aus der ich dann sozusagen dass Array auslese. Als ersten brauchte ich zusätzlich eine Identifikationsspalte, in der jede Frage eine Zahl zugewiesen bekommt. Ansonsten gestaltete ich die Datenbanktabelle so, wie es aus dem Array her logisch schien. Nun kam ich an dem Punkt nicht weiter, das Array nach fragenr geordnet zu erstellen. Ich habe allerdings einen sehr großen Zeitaufwand (vielleicht etwa 6 bis 7 Stunden) gebraucht (die Auswertung habe ich ja auch schon erstellt), da ich in Sachen PHP noch sehr unerfahren bin (ich habe vor etwa einem Monat angefangen), sodass ich ungern meine bisherige Struktur über den Haufen werfen würde.
Ich hoffe, ihr versteht nun meine Denkensweise mit dem Array und der Datenbankstruktur und könnt mir, da ihr nun genauer wisst, was ich vorhabe, auch genauere Tipps geben.
mfg
Maddinyo
Mahlzeit maddinyo,
Die Zeichenkette @/@, die ich so gewählt habe, weil sie vergelichsweise kurz ist und sie wahrscheinlich kein Benutzer in einer Antwortmöglichkeit so darstellen möchte, markiert, wie schon kommentiert, die richtige Antwort, die ich später für die Auswertung brauche, denn so konnte ich mit der if-abfrage (if(strpos($frage[$i][$key], "@/@") === false){echo "0";}else {echo "1";}) einen value für die option definieren.
... und den Teilnehmern am Quiz gleich die Möglichkeit gegeben, im Quelltext die richtige Lösung nachzuschauen. Die Auswertung von Benutzereingaben (und dazu gehören auch Antworten auf Quizfragen) hat auf dem Server zu erfolgen - sonst nirgendwo. Ansonsten bist Du nicht gegen Manipulationen gefeit.
Deswegen sollte als Wert der möglichen Antworten auch ihre ID übergeben werden - nichts anderes. Dann kannst Du mittels der gegebenen Antwort und der in der Datenbank hinterlegten Zuordnung, welche Antwort richtig ist, prima herausfinden, ob die Antwort richtig war.
Als ersten brauchte ich zusätzlich eine Identifikationsspalte, in der jede Frage eine Zahl zugewiesen bekommt.
Wenn Du ein sinnvolles Datenbankdesign gewählt hast, hast Du sowieso einen eindeutigen Primärschlüssel (in der Regel numerisch) für jeden Eintrag jeder Tabelle.
Ansonsten gestaltete ich die Datenbanktabelle so, wie es aus dem Array her logisch schien.
Nein, falsche Herangehensweise. Gestalte die Tabelle(n) so, dass die Abhängigkeiten der einzelnen Datenbankobjekte korrekt abgebildet ist.
Ich habe allerdings einen sehr großen Zeitaufwand (vielleicht etwa 6 bis 7 Stunden) gebraucht (die Auswertung habe ich ja auch schon erstellt), da ich in Sachen PHP noch sehr unerfahren bin (ich habe vor etwa einem Monat angefangen), sodass ich ungern meine bisherige Struktur über den Haufen werfen würde.
Wenn die Struktur ungünstig ist bzw. damit gewisse Anforderungen nicht erfüllt werden können, ist es absolut irrelevant, wie lange Du dafür bisher gebraucht hast ...
Ich hoffe, ihr versteht nun meine Denkensweise mit dem Array und der Datenbankstruktur und könnt mir, da ihr nun genauer wisst, was ich vorhabe, auch genauere Tipps geben.
Die Datenbankstruktur, die Du kurz skizziert hattest, ist trotzdem - freundlich gesagt - unglücklich. Die drei Grundregeln beim Datenbankdesign sind Normalisieren, Normalisieren und Normalisieren.
MfG,
EKKi