| (Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI... |
Diskussion: Ein Quiz programmieren im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Anzeige Erstmal Hallo. Ich habe vor, mir ein Quiz zu programmieren, nur leider weiß ich gar nit wo ich anfangen ...
![]() |
| | #1 (permalink) |
| Guest Likes: | Anzeige Erstmal Hallo. Ich habe vor, mir ein Quiz zu programmieren, nur leider weiß ich gar nit wo ich anfangen soll und was ich genau dafür brauche. Ich möchte in einer csv datei, jeweils die Frage und die Antwort stehen haben, dann per random irgendeine Frage ausgeben lassen und sobald die Antwort eingebenen wurde einen Vergleich zur Antwort in der csv datei starten lassen, welcher mit einer direkten Ausgabe vorhanden ist. Dieses Quiz dient mir nur dazu zu lernen, php näher kennen zu lernen und so anschließend auch vll andere Dinge mit php realiseiren zu können. Es soll also kein Multiple Choice test sein, ich möchte keine fertigen Scripts, sondern nur denkansätze und möchte gern wissen, was ich dafür lernen muss. Wäre sehr freundlich wenn mir geholfen werden könnte. Liebe Grüße, MrDiek |
|
| | #2 (permalink) |
| Warum muss es eine .csv Datei sein? Speicher Frage und Antworten doch nach einem bestimmten Schema in einer .txt datei ab, erzeuge mittels rand() eine Zufallszahl, mit der eine .txt Datei ausgelesen wird und lass aus dem Inhalt ein Formular entstehen. | |
| | |
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) |
| Guest Likes: | Weil ich bereits alle Fragen in Excel eingegeben habe, die in eine csv datei umgewandelt habe und daraus nun das uiz hervorbringen möchte. Also brauch ich nen Formular und die Funktion rand und das wars fast ? Wie kann ich die denn am leichtesten auslesen aus der csv datei ? Liebe Grüße, MrDiek |
|
| | #4 (permalink) |
| Registriert seit: 26.03.08 ![]() Likes: 0 | habe selber keine ahnung von csv aber evtl helfen dir die beiden links hier weiter 1: http://www.webmaster-resource.de/tri...p-einlesen.php 2: http://www.php.net/manual/de/function.fgetcsv.php |
| | |
| | #5 (permalink) |
| Achso gut. Hab mich noch nie mit Excel beschäftigt und kenn die Dateiendungen nicht. | |
| | |
| | #6 (permalink) |
| Guest Likes: | Danke für die beiden Links. Werd mal schauen wie weit ich damit komme und melde mich dann wieder. LIebe Grüße, MrDiek EDIT: So bin weitergekommen, weiß allerdings nun irgendwie nicht weiter. Und zwar versuche ich nun aus der csv-datei eine zufällige Frage ausgeben zu lassen. Soviel habe ich bisher: Code: <?php
// Datei wird geöffnet
$datei = fopen("Quiz.csv", "r");
// Anzahl der Felder wird ermittelt
while( ( $daten = fgetcsv($datei, 1000, ";")) !==FALSE)
{
$feldanzahl = $feldanzahl + count($daten);
}
// Datei wird geschlossen
fclose($datei);
// Anzhal der Felder lässt Rückschluss auf Anzhal der Fragen zu
$feldanzahl = $feldanzahl / 2;
// Information über die Menge der Fragen als Ausgabe
echo "Es sind <b>" . $feldanzahl . " Fragen</b> vorhanden!";
// ERstellen einer ZUfallszahl im Bereich der Menge der Fragen
srand ( (double)microtime () * 1000000 );
$zufall = rand(1, $feldanzahl);
// Feststellung, ob die Zahl eine gerade oder ungerade ist
// Dient dazu, dass nur gerade genommen werden, da alle ungeraden
// die Antworten in der csv-datei sind
if(($zufall % 2) == 0)
{
}
else
{
$zufall++;
}
?> Liebe Grüße, MrDiek |
|
| | #7 (permalink) |
| Registriert seit: 17.02.06 ![]() Likes: 0 | Ahhh, interessant. Man lernt nie aus. "fgetcsv" kannte ich noch nicht. Habe mir bislang immer mit einem manuellen Zerlegen per explode und eigenem Escaping geholfen. Aber als fertige Funktion dürfte das natürlich schneller gehen. @MrDiek: Du liest die Daten immer nur in eine temporäre Variable ein, um sie gleich wieder zu verwerfen. Mach's doch mal so: Code: ...$daten[] = fgetcsv... Anschließend hast Du wahlfreien Zugriff auf die Dinger... Code: ...$daten[$zufall]... |
| | |
| | #8 (permalink) |
| Guest Likes: | Vielen Dank. Da hier gestern nichts mehr auftauchte habe ich einfach mal weitergemacht. Nun bin ich bisher soweit angekommen das ich 2 Dateien habe. Datei 1 ( Quiz.php): Code: <?php
// Ermittlung der Menge der Fragen
$datei = fopen("datenbank/Quiz.csv", "r");
while( ( $daten = fgetcsv($datei, 1000, ";")) !==FALSE)
{
$feldanzahl = $feldanzahl + count($daten);
}
fclose($datei);
$feldanzahl = $feldanzahl / 2;
echo "Es sind <b>" . $feldanzahl . " Fragen</b> vorhanden! <br><br>";
// Zufallszahl
srand ( (double)microtime () * 1000000 );
$zufall = rand(1, $feldanzahl);
if(($zufall % 2) == 0)
{
}
else
{
$zufall++;
}
// Wertübergabe
$data = array();
$datei = fopen("datenbank/Quiz.csv", "r");
while($row = fgetcsv($datei, 5000, ";"))
{
$data[] = $row;
}
fclose($datei);
// Speicherung der FRage Ausgabe der Frage
$cell1 = $data[$zufall-1][0];
echo "Frage: " . $cell1 . "<br>";
// Speicherung der dazugehörigen Antwort
$cell2 = $data[$zufall-1][1];
// Eingabe
echo "<form action=\"Auswertung.php\" method=\"post\">";
echo "Antwort: <input type=\"text\" name=\"ant\" /><br />";
echo "<input type=\"hidden\" name=\"frage\" value=\"$cell1\">";
echo "<input type=\"hidden\" name=\"antw\" value=\"$cell2\">";
echo "<input type=\"submit\" name=\"submit\" value=\"Und ab!\">";
echo "</form>";
?> Code: <?php
$frage = $HTTP_POST_VARS['frage'];
$antw = $HTTP_POST_VARS['antw'];
$antwort = $HTTP_POST_VARS['ant'];
if($antwort == $antw)
{
echo "Ihre Antwort: " . $antwort . "<br>";
echo "Frage: " . $frage . "<br>";
echo "Die Antwort ist " . $antw . "<br>";
echo "Sie haben richtig geantwortet!<br> <br>";
}
else
{
echo "Ihre Antwort: " . $antwort . "<br>";
echo "Frage: " . $frage . "<br>";
echo "Die Antwort ist " . $antw . "<br>";
echo "Sie haben nicht richtig geantwortet!<br><br>";
}
echo "Nächste Frage: <a href=\"Quiz.php\"> Link </a>";
?> Also alles in einem Fenster. Und noch ne Frage. Ist es beo php möglich sekundengenau nach der Eingabe die FRage kommen zu lassen ??? Liebe Grüße, MrDiek EDIT: Hab grad noch etwas bemerkt. Ist es möglich, dass ich direkt einstelle, dass keine Antwort im Browser gespeichert wird ? |
|
| | #9 (permalink) |
| Uff, viele Fragen auf einmal ... 1) Du musst dein Formular nicht auf eine zweite Datei zeigen lassen. Du kannst alles in einer Datei erledigen und am Anfang auf Existenz der POST-Variablen prüfen. PHP-Code: Dafür gibt es das Konzept der Sessions. Du musst ganz am Anfang des Scriptes mit session_start(); eine Session anlegen und kannst dann (solange du dich in dieser Session bewegst) auf Variablen der Bauart $_SESSION['irgendwas'] zugreifen und darin dauerhaft Sachen speichern. 3) Sekundengenau nach Eingabe die Antwort auszuwerten, ist nur durch intensiven Einsatz von Javascript möglich. Das wird meistens als AJAX (Asynchronous Javascript And XML) bezeichnet und gehört zu den fortgeschrittenen Themen, zu denen man schon einiges über HTTP, HTML und Javascript wissen muss. 4) Um das Speichern von Werten im Antwortfeld durch den Browser zu unterbinden, sollte es genügen, dem Eingabefeld noch ein value="" zu spendieren. mfg, metax.
__________________ Wenn keiner zuschaut, teile ich heimlich durch Null! Meine Homepage: Planet Metax | meine Bilder: DeviantArt | Twitter | |
| | |
| | #10 (permalink) |
| Registriert seit: 17.02.06 ![]() Likes: 0 | Ja, das geht in die richtige Richtung. Eventuell kannst Du vor einer sophistischen Lösung mit Javascript (die auch wieder gefälscht werden könnte) noch eine ganz einfache und doch funktionssichere probieren: In PHP kannst Du die zum Einreichen der Lösung verstrichene Zeit messen (einfach die "time" der Anfrage in der "Session" speichern und bei jeder neuen Anfrage die aktuelle "time" mit der gespeicherten vergleichen). Bei Überschreitung dann ein "leider zu lange gebraucht" ausgeben oder so ähnlich. Übrigens kannst Du Dir das doppelte Einlesen Deiner Datei ersparen. Die Menge der Datensätze hast Du doch eh im Datenfeld "$daten" zu stehen: count($daten) |
| | |
| | #11 (permalink) |
| Guest Likes: | Hallo nochmal... Code: <?php
if(isset($_POST['ant']))
{
// Verarbeite Antwort
$frage = $HTTP_POST_VARS['frage'];
$antw = $HTTP_POST_VARS['antw'];
$antwort = $HTTP_POST_VARS['ant'];
if($antwort == $antw)
{
echo "Ihre Antwort: " . $antwort . "<br>";
echo "Frage: " . $frage . "<br>";
echo "Die Antwort ist " . $antw . "<br>";
echo "Sie haben richtig geantwortet!<br> <br>";
}
else
{
echo "Ihre Antwort: " . $antwort . "<br>";
echo "Frage: " . $frage . "<br>";
echo "Die Antwort ist " . $antw . "<br>";
echo "Sie haben nicht richtig geantwortet!<br><br>";
}
// Ermittlung der Menge der Fragen
$datei = fopen("datenbank/Quiz.csv", "r");
$data = array();
while( ( $daten = fgetcsv($datei, 1000, ";")) !==FALSE)
{
$feldanzahl = $feldanzahl + count($daten);
$data[] = $daten;
}
fclose($datei);
$feldanzahl = $feldanzahl / 2;
echo "Es sind <b>" . $feldanzahl . " Fragen</b> vorhanden! <br><br>";
// Zufallszahl
srand ( (double)microtime () * 1000000 );
$zufall = rand(1, $feldanzahl);
if(($zufall % 2) == 0)
{
}
else
{
$zufall++;
}
// Speicherung der FRage Ausgabe der Frage
$cell1 = $data[$zufall-1][0];
echo "Frage: " . $cell1 . "<br>";
// Speicherung der dazugehörigen Antwort
$cell2 = $data[$zufall-1][1];
// Eingabe
echo "<form action=\"Quiz2.php\" method=\"post\">";
echo "Antwort: <input type=\"text\" value=\"\" name=\"ant\" /><br />";
echo "<input type=\"hidden\" name=\"frage\" value=\"$cell1\">";
echo "<input type=\"hidden\" name=\"antw\" value=\"$cell2\">";
echo "<input type=\"submit\" name=\"submit\" value=\"Und ab!\">";
echo "</form>";
}
else
{
// Ermittlung der Menge der Fragen
$datei = fopen("datenbank/Quiz.csv", "r");
$data = array();
while( ( $daten = fgetcsv($datei, 1000, ";")) !==FALSE)
{
$feldanzahl = $feldanzahl + count($daten);
$data[] = $daten;
}
fclose($datei);
$feldanzahl = $feldanzahl / 2;
echo "Es sind <b>" . $feldanzahl . " Fragen</b> vorhanden! <br><br>";
// Zufallszahl
srand ( (double)microtime () * 1000000 );
$zufall = rand(1, $feldanzahl);
if(($zufall % 2) == 0)
{
}
else
{
$zufall++;
}
// Speicherung der FRage Ausgabe der Frage
$cell1 = $data[$zufall-1][0];
echo "Frage: " . $cell1 . "<br>";
// Speicherung der dazugehörigen Antwort
$cell2 = $data[$zufall-1][1];
// Eingabe
echo "<form action=\"Quiz2.php\" method=\"post\">";
echo "Antwort: <input type=\"text\" value=\"\" name=\"ant\" /><br />";
echo "<input type=\"hidden\" name=\"frage\" value=\"$cell1\">";
echo "<input type=\"hidden\" name=\"antw\" value=\"$cell2\">";
echo "<input type=\"submit\" name=\"submit\" value=\"Und ab!\">";
echo "</form>";
}
?> Sollte ich nur Enter eingeben erscheint bei mir trotzdem vor der neuen Frage noch die Verarbeitung, nur das keine Antwort von mir gegeben ist und somit die Antwort als falsch eingestuft wird. Könnt ihr mir sagen, wo nun mein fehler liegt ? Liebe Grüße, MrDiek |
|
| | #12 (permalink) |
| Registriert seit: 17.02.06 ![]() Likes: 0 | 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> Code: "Eine Testfrage..."; "Test"; |
| | |
| | #13 (permalink) |
| Guest Likes: | Halli hallo.. Erstmal vielen Dank, dass sieht ja schon um einiges überschtlicher aus Da sieht man wohl das ich so gut wie nie mit php arbeite..Nunja, warum jede Zahl nur gerade ? Ganz einfach. die csv datei ist folgend aufgebaut: Spalte 1 Spalte 2 Zeile 1 Frage 1 Antwort 1 Zeile 2 Frage 2 Antwort 2 In diesem Fall zählt er bei count daten 188 Felder, was 94 Fragen und 94 Antworten bedeutet. Somit das, dass er nur 1, 3, 5, 7, 9 usw FRagen darstellen und alle geraden Felder die Antworten. Dein code funktioniert hier bei mir leider nicht, Hab es grad mal eben gestest und bei korrekt gibt er dann eine nächste Frage an... Liebe Grüße, MrDiek PS: ICh seh grad $feldanzahl muss nicht mehr durch 2 geteilt werden, ich das irgendwie umstänmdlich gemacht hab und dort 188 felder gezählt wurden und nicht wie bei dir jede Zeile. ?( ?( Ganz schön blöd von mir, warum auch immer ![]() P.P.S.: omG Die Häjfte der Fragen weggelassen. Der totale Denkfehler. Ich überarbeite den Code nochmal komplett |
|
| | #14 (permalink) | |
| Moderator ![]() Registriert seit: 13.12.04 ![]() Likes: 0 | Zitat:
__________________ [Wer glaubt, dass Projektleiter Projekte leiten, glaubt auch, dass Zitronenfalter Zitronen falten.] | |
| | |
| | #15 (permalink) |
| Registriert seit: 17.03.04 ![]() Likes: 2 | @MrDiek Warum liest Du bei jedem Request die Datei neu ein? Die Daten könntest auch in einer Session speichern. Die srand() Funktion brauchst Du seit PHP 4.2.0 eigentlich nicht mehr. $zufall = rand(1, $feldanzahl) * 2 - 2; Also so wird das nichts, bei einem Array mit 10 Elementen hättest Du hier einen Index von 18, was Dir sofort eine Fehlermeldung um die Ohren haut. Bei diesem Quiz kann jede Frage mehrfach vorkommen, was ja eigentlich nicht Sinn und Zweck von einem Quiz ist. Ich hab mal schnell Dein Script angepasst, und das ist dabei rausgekommen: PHP-Code:
__________________ Mfg Basic Avid - Use it or be used! - |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Film-Bilder Quiz | ivegotmail | Music- & Filmbox | 1132 | 17.06.11 20:07 |
| Ein kleines Quiz | weau | Fun Section | 5 | 17.06.07 16:30 |
| Ein Quiz programmieren | RemoteC | (Web-) Design und webbasierte Sprachen | 20 | 06.06.06 21:14 |
| Ossi Quiz | malloc() | Off topic-Zone | 20 | 11.05.05 16:03 |
| Einsteins Quiz: | Indi | Off topic-Zone | 6 | 30.01.02 17:44 |