Also, erstmal würde es gut tun, das Zeug etwas zu systematisieren, weil man ja nicht mehr sieht, was wozu gehört. Außerdem würde es der Übersichtlichkeit gut tun, dieses doppelte Einlesen der Daten zu vermeiden. Außerdem wäre es gut, auf das doppelte Zusammenbauen der Anzeige zu verzichten.
Dann fallen noch auf:
- Was Du mit der Feldanzahl machst, sieht nicht nach derselben aus.
- Warum willst Du auf die Hälfte aller Fragen verzichten?
- Das Datenfeld nennst Du einmal "data", dann wieder "daten" - das KANN nicht funktionieren
- Du führst zwischendurch temporäre Variablen ein, die alle möglichen kryptischen Bezeichnungen tragen, obwohl Du AUSSERDEM dieselben Dinger mit eindeutigen, beschreibenden Bezeichnern versiehst - wenn nicht in PHP, dann im HTML-Bereich. Warum diese Doppelnamigkeit? Warum diese Kryptigkeit? Warum nicht einfach und verständlich?
- Wenn Du größere Abschnitte von HTML-Text einbauen willst, in denen nur ausgewählt wenige Elemente sich aus Variablen zusammensetzen sollen, ist es günstiger, in den HTML-Modus zurückzuschalten. In einem anständigen Editor siehst Du dann das Syntax-Highlighting für HTML dargestellt und hast viel leichter zu lesenden Text.
...Beim Bereinigen Deines Programms fällt mir auf: Du hast offenbar Deine Datensätze so abgespeichert, daß immer ein Datensatz als Frage kommt und dann einer als Antwort, richtig?
DANN wird das Bestehen auf geraden Indizes beim Würfeln verständlich.
Sowas solltest Du dir angewöhnen, im Quelltext zu dokumentieren.
Für Dich wie für fremde Leute wie uns hier im Forum.
So sieht das dann aus:
Code:
<?php
// =====================
// Ermittlung der Fragen
// =====================
$datei = fopen("Quiz.csv", "r");
if (!$datei)
{
echo 'Sorry: Die Quiz-Datenbank wurde nicht gefunden<br/>';
return;
}
$daten = array();
while( ( $datensatz = fgetcsv($datei, 1000, ";") ) !== FALSE) $daten[] = $datensatz;
fclose($datei);
// P.S.: Mit der Erkenntnis über die Struktur der Quiz-Datei wird die Erzeugung
// der feldanzahl eindeutig und viel einfacher:
$feldanzahl = count($daten) / 2;
echo "Es sind <b>" . $feldanzahl . " Fragen</b> vorhanden! <br><br>";
// eine gerade Zufallszahl erzeugen... (-> warum ausgerechnet gerade??)
// Warum willst Du auf die Hälfte aller Fragen verzichten?
// ...P.S.: Aus dem Rest des Programms ersichtlich: Die Daten beinhalten abwechselnd
// eine Frage und eine Antwort.
srand ( (double)microtime () * 1000000 );
/*
$zufall = rand(1, $feldanzahl);
if(($zufall % 2) != 0) $zufall++;
// -> vor allem: NICHT SO! Damit kann der Index außerhalb der erlaubten Bereichs liegen!
// -> MINDESTENS muß noch eine Begrenzung kommen:
if ($zufall > $feldanzahl) $zufall -= 2;
*/
// P.S.: Mit der Erkenntnis über die Struktur der Quiz-Datei wird die Erzeugung
// der Zufallszahl eindeutig und viel einfacher:
$zufall = rand(1, $feldanzahl) * 2 - 2;
// ========================
// Verarbeitung der Antwort
// ========================
if(isset($_POST['submit']))
{
// Verarbeite Antwort
$index = $HTTP_POST_VARS['index'];
$antwort = $HTTP_POST_VARS['antwort'];
$frage = $daten[$index+0][0];
$soll = $daten[$index+1][0];
echo "Die letzte Frage war: ".$frage."<br>";
echo "Ihre Antwort war: ".$antwort."<br>";
echo "Korekt wäre gewesen: ".$soll."<br>";
if($antwort == $soll)
{
echo "Sie haben richtig geantwortet!<br><br>";
}
else
{
echo "Sie haben nicht richtig geantwortet!<br><br>";
}
}
// =========================
// Ausgabe der Frage
// =========================
// OHNE Speicherung der dazugehörigen Antwort...
$frage = $daten[$zufall][0];
?>
<form method="post">
Nächste Frage: <?=$frage?><br/>
Ihre Antwort: <input type="text" value="" name="antwort" /><br/>
<input type="hidden" name="index" value="<?=$zufall?>">
<input type="submit" name="submit" value="Und ab!">
</form>
Ach ja: Aufgrund der Seltsamkeit Deiner Datenbank gehört ein Testdatensatz mit dazu. Was ich an Vermutung herausgelesen habe, sollte in etwa auf folgendes hinauslaufen:
Code:
"Eine Testfrage...";
"Test";
In Funktion sieht das dann so aus:
http://harryboeck.dyndns.org/Experimente/Habo/mrdiek-quiz.php