Beiträge von Failix

    Sempervivum Wiederum herzlichen Dank, wenngleich die beiden Links mir – zumindest mit meinem derzeitigen Wissensstand – überhaupt nicht weiterhelfen. Das, was ich gerade tue, ist nichts als hilfloses Stochern in einer für mich trüben Brühe, die nur dann aufklart, wenn mir jemand konkret sagt, was zu tun ist.


    Klar bin ich enttäuscht, dass das alles für mich so kompliziert ist. Anderseits muss ich aber auch bedenken, dass ich erst vor ziemlich genau drei Monaten damit angefangen habe, mich überhaupt mit Programmierung zu beschäftigen und dass ich dafür nur wenige Stunden in der Woche Zeit habe. Ich würde gern viel schneller viel mehr wissen, aber der Weg ist steinig und steil. :(


    Die genannte überflüssige Zeile zu löschen, hat mich zumindest von jener PHP-Warnung befreit. Nun bekomme ich auf PHP-Seite auch {"id": "1", "trueanswer": false} bzw. {"id": "1", "trueanswer": true} geliefert, je nach angeklickter Antwort. Das funktioniert also. Aber das JavaScript kann damit leider nichts anfangen.


    Die Online-Version ist aktuell: http://music-quiz.bplaced.net/


    m.scatello Ich hatte die öffnende Klammer und die Zeile mit den Zugangsdaten weggelassen, aber das ist natürlich blöd, wenn man eine Fehlermeldung mit Zeilenangabe postet ... sorry!

    Leider funktioniert der Code nicht wie gewünscht, hier die aktuelle Datei "animalgame3.php":



    Ich bekomme die Warnung "Trying to access array offset on value of type bool in /users/music-quiz/www/animalgame3.php on line 21". Dazu spuckt Google knapp 7 Millionen Treffer aus ... das, was ich zu lesen bekomme, ist für mich völlig unverständlich.


    Schalte ich die PHP-Warnungen aus, wird mir ausschließlich {"id": "1", "trueanswer": false} zurückgegeben – egal, welche Antwort ich anklicke.


    Das Ganze ist auch online zu sehen: http://music-quiz.bplaced.net/

    Ich bin jetzt dazu gekommen, mir den Code anzuschauen. Ich habe verstanden, dass neben der ID auch die gewählte Antwort an den Server geschickt wird.


    Ich habe versucht, die Datei "animalgame3.php" anzupassen, hier der bisherige Code:



    Mein Versuch sieht so aus:



    Das überträgt jetzt den Wert der gewählten Antwort, aber ob es der korrekte Ansatz ist, weiß ich nicht – dummerweise ersetzen gerade Vermutungen die Erkenntnis.


    Und dann wäre ja auch noch die Abfrage im JavaScript:


    if (questions.answers[j] == rightOne.trueanswer) {


    Mir ist völlig unklar, welche beiden Werte ich nun miteinander vergleichen müsste. Für Licht in meinem geistigen Dunkel wäre ich dankbar ...

    Als ich die Datenbank erstellt habe, kam mir bereits der Verdacht, dass es nicht gut ist, was ich da mache: Ich habe eine Spalte "trueanswer" angelegt und dort die jeweils richtige Antwort eingetragen. Schon allein die Redundanz war mir dabei nicht geheuer.


    Dein Vorschlag klingt gut, aber ich habe nicht die leiseste Vorstellung, wie ich ihn umsetzen könnte. Da sind zwei Dinge, die ich nicht weiß:


    1. Wie müsste die Datenbank strukturiert sein, wie wird der richtige Eintrag gekennzeichnet? Was ein Boolean ist, weiß ich aber. ;)


    2. Wie schicke ich etwas zum Server? Bisher habe ich ja immer nur etwas geholt, habe also per JavaScript PHP-Dateien angesprochen, die Daten geholt haben. Oder ist mit "schicken" dasselbe Vorgehen gemeint?

    Ein Problemchen habe ich doch noch, deswegen hier ein simples Online-Beispiel:


    http://music-quiz.bplaced.net/


    Das Javascript: http://music-quiz.bplaced.net/animalgame.js


    Bis ich mich für eine Antwort entscheide, sehe ich die korrekte Antwort nicht im Quellcode. Wenn ich aber die falsche Antwort anklicke, wird die Datei "animalgame3.php" geladen, weil ich jetzt ja mit PHP in der DB nachschauen muss, was als korrekte Antwort hinterlegt ist, und mit dieser Datei ist auch die richtige Antwort im Quellcode der Seite abrufbar.


    Bei nur zwei Antwortmöglichkeiten ist das natürlich nicht weiter schlimm, aber bei vier Antworten ist es doch irgendwie unschön. Habe ich hier etwas falsch aufgebaut oder lässt es sich nicht anders lösen?

    Herzlichen Dank für Deine schnelle Antwort! Und schon funktioniert das Blättern wie gewünscht. Jetzt passe ich noch den Code meines Spiels an und hoffe, dass es dort genauso einfach ist.


    Das let habe ich schlichtweg vergessen – prima, dass es Dir aufgefallen ist. Und auch prima, dass meine Codestruktur nicht so abwegig ist, wie ich erst dachte. :)

    Ich bin auf meinem lokalen Server ein ganzes Stück weitergekommen. Ich kann eine Frage generieren und Antworten vorgeben. Erst beim Klick auf eine Antwort wird bei der Datenbank abgefragt, ob die Antwort richtig oder falsch ist, das Ergebnis wird angezeigt. Ich habe also das Ziel erreicht, dass die korrekte Antwort nicht im Quelltext zu finden ist. Das ist prima, aber etwas anderes ist gar nicht prima: Ich bin zu blöd, den Zähler um eine Stelle zu erhöhen ...


    Um das zu verdeutlichen, hier ein ganz abgespecktes Stück Code:



    In Zeile 1 wird der Zähler für die ID definiert.


    In Zeile 3 wird die Konstante oneQuestion definiert, sie bekommt die ID 1 zugewiesen. Anschließend wird mithilfe von PHP das Array angelegt.


    Ab Zeile 12 werden die Frage und die Antworten angezeigt. Das findet alles innerhalb der Konstante oneQuestion statt, da sonst ja gar nichts angezeigt wird. Ob das so korrekt ist ... ich bin sehr unsicher.


    Und nun würde ich mich gern durch die Fragen blättern (in meinem Beispiel geht es noch gar nicht um korrekte Antworten). Aber ich bekomme es nicht hin, die richtige Stelle zu finden, an der ein Klick-Event ein i++ so auslösen könnte, dass sich der Zähler auch wirklich erhöht und man die zweite Frage angezeigt bekommt.


    Irgendwie bin ich damit vor die Wand gefahren, vermutlich ist der Aufbau dieses Codes nicht korrekt. Könnte bitte jemand helfen?


    Wie kann ich den Zähler erhöhen? Klar, dass ich dazu noch ein klickbares Element anlegen muss, aber an welcher Stelle? Vielen Dank!

    Ich habe es lösen können. Mir ist hier doch tatsächlich die fehlerhafte Codierung auf die Füße gefallen, von der ich glaubte, sie zunächst ignorieren zu können. Aufgefallen ist es mir, als ich alle IDs durchgegangen bin – ID5 ist die erste ohne Umlaute, und dort trat das Problem nicht auf.


    m.scatello hatte mir in #75 einen Link genannt (danke!), durch den ich Abhilfe schaffen konnte - ein ;charset=UTF8 hinter dem Namen der war die simple Lösung. Während die Umlaute kürzlich nur falsch dargestellt wurden, haben sie im aktuellen Code einen bösen Fehler produziert.


    Sempervivum Ich habe die "kaputte" Version mal online gelassen – http://music-quiz.bplaced.net/o04.html –, da ich fragen möchte, ob ich mithilfe des Netzwerk-Tabs dieses Umlautproblem hätte feststellen können. Ich hatte mir dieses Tab ja gestern bereits angeschaut und bin dabei lediglich auf die Zeile 22 im JavaScript gestoßen, von der ich glaubte, sie sei fehlerhaft: }).then(res => {


    Hätte ich daraus auf die Umlaute schließen können bzw. müssen?

    Sempervivum Entschuldige bitte, die spitze Klammer war ein blöder Fehler von mir (ich bin mit den Zugangsdaten durcheinander gekommen). Jetzt gibt es online nur noch "Unexpected end of JSON input".


    Ich werde in den nächsten Tagen mal schauen, ob ich dazu eine Info bekomme, die ich auch verstehe (die Gewichtung liegt auf dem Nebensatz, den Infos gibt es genug). Für heute mache ich Schluss, sonst passiert noch mehr solcher Müll wie mit den Zugangsdaten.

    Hier noch etwas zu jenem Problem, dass das Ganze online nicht funktioniert. Ich habe meine DB, das PHP-Script und auch die HTML-Seite auf einen weiteren (privaten) Webspace geladen, auch hier ohne Erfolg. In beiden HTML-Seiten bekomme ich einen Fehler in der Konsole angezeigt:


    Bei bplaced: Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 3


    Beim privaten Webspace: Uncaught (in promise) SyntaxError: Unexpected end of JSON input


    Bei beiden folgt dann:


    Promise.then (async)

    (anonymous) @ o03.html:22


    Zeile 22 ist diese Zeile im JavaScript:

    }).then(res => {


    Aber lokal funktioniert doch alles ...


    PHP-Fehler gibt es übrigens keine, ich konnte auf meinem Webspace die Fehlermeldungen einschalten.

    Jetzt kommt langsam Licht ins Dunkel! Ein wunderbares Gefühl, nachdem ich wirklich lange blind umhergeirrt bin. Ja, ich gewinne eine Vorstellung dessen, was zu tun ist, ein Wunder, ein Wunder! :)


    Ich glaube, ich komme nun voran und kann die einzelnen Werte aus dem ersten Array zu HTML wandeln. Und dann schaue ich weiter. Sollte ich am Ende wirklich etwas gelernt haben? Vielen, vielen Dank für den Support, Sempervivum, auch wenn ich mich damit (gern) wiederhole ...

    So, jetzt funktioniert's lokal. Aber erst, nachdem ich $row = fetch($statement); zu $row = $statement->fetch(); geändert hatte, wie ich es in meinem alten Script gesehen hatte, denn $row = fetch($statement); sei eine nicht definierte Funktion, meldeten Editor und PHP. Juhu, ich habe mal selbst was reparieren können. :)


    Wie geht's nun weiter? Mir ist die Abfolge (damit meine ich gar nicht den Code, sondern eher die Logik dahinter) noch immer nicht klar. Hier mal ein kleiner Dialog, was ich mir so denke:


    JavaScript: "Du, PHP-Script, ich würde gern das Spiel beginnen. Holst du mir Fragen und Antworten zu Frage 1 aus der DB? Ich mache dann HTML draus."


    PHP-Script: "Geht klar, ich schaue mal in die Datenbank nach ID 1 ... ja, hier hast du!"


    JavaScript: "Prima! Ich hab's ausgegeben, und der User hat die vierte Antwort angeklickt. PHP-Script, ist das denn richtig?"


    PHP-Script: "Moment, ich schaue wieder in der DB nach ... ja, passt! Und ich habe hier noch 50 Punkte, die kannst du dem User jetzt anzeigen!"


    JavaScript: "Habe ich, und dazu den Button für die zweite Frage. Wenn der User darauf klickt, machen wir dann alles wieder wie beim ersten Mal?"


    PHP-Script: "Machen wir! Du weißt aber hoffentlich, wann Schluss ist ..."


    Ich nehme also an, dass das PHP-Script immer wieder Kontakt zur Datenbank herstellen muss, weil es ja keine Daten vorlagern darf. Aber bräuchte ich dazu nicht nur eins, sondern mehrere PHP-Scripte? Denn, schauen wir mal in den aktuellen PHP-Code:


    Code
    $output = [
          'id' => $id,
          'question' => $row['question'],
          'answers' => [],
        ];
        $output['answers'][] = $row['answer1'];
        $output['answers'][] = $row['answer2'];
        $output['answers'][] = $row['answer3'];
        $output['answers'][] = $row['answer4'];


    Hier werden ja nur Frage und Antworten abgelegt, mehr kennt das PHP-Script noch nicht. Müsste das JavaScript für die Ermittlung der Lösung und Anzeige der gewonnenen Punkte dann ein weiteres PHP-Script ansprechen? Oder bin ich auf dem Irrweg und/oder einfach zu voreilig?

    m.scatello Klingt einleuchtend, für den Praxisgebrauch (so es dann mal so weit ist) werde ich es vermeiden.


    Sempervivum Die DB ist online gefüllt, PHP spuckt keine Fehler aus. Ich würde das aber erst mal als sekundär betrachten und lieber lokal weitermachen, damit ich vorankomme.


    Zu Deinem Code in #78: Ist das nicht der alte Code, den ich ursprünglich mal verwendet habe und sind die oberen Zeilen, mit denen eine ID abgefragt wird, jetzt nicht überflüssig? Das fetch hatte ich dort in einer Schleife: while ($row = $statement->fetch()) ..., wo und wie ich es in den aktuellen Code einsetzen müsste, weiß ich nicht.


    Und eines frage ich mich auch noch: Ich kann derzeit lokal einen JSON-String in eine PHP-Datei laden, der von JavaScript weiterverarbeitet wird. Aber war nicht das eigentliche Ziel, die Inhalte des Quiz' nicht lokal abzulegen und immer nur die benötigten Teile aus der DB abzufragen? Irgendwie habe ich das immer noch nicht wirklich verstanden ...

    Ich habe es doch tatsächlich hinbekommen, allerdings nur lokal. Ich erzeuge mit PHP einen JSON-String, das JavaScript in der HTML-Datei liest ihn aus. Hurra! 8)


    Warum dasselbe online nicht funktioniert, habe ich noch nicht herausbekommen. Die PHP-Datei (sie unterscheidet sich nur durch die Zugangsdaten von der lokalen Datei) bleibt leer, es gibt keinerlei Fehlermeldung: http://music-quiz.bplaced.net/o02.php


    In dieser Datei wird die Verbindung zur DB mit mysqli hergestellt und nicht, wie Sempervivum es empfohlen hat, mit PDO. Liegt daran, dass ich ein Tutorial aus dem Netz verwendet habe, um den JSON-String zu erzeugen und ihn noch nicht umbauen kann. Können die Online-Probleme damit etwas zu tun haben? Hier der Code:



    Wie gesagt, lokal unter MAMP funktioniert der Code.


    Sempervivum Aus o. g. Text ist ersichtlich, dass ich mich für Variante 2 entschieden habe. So langsam und mühevoll nähere ich mich einem ersten Teilziel. Und es ist an der Zeit, Dir wieder einmal zu sagen, wie sehr ich Deine Unterstützung zu schätzen weiß. Oder, profan ausgedrückt: Ohne Dich wäre ich aufgeschmissen. Danke, danke, danke! :)


    m.scatello Danke für den Link! Wenn ich mal wieder Daten zu sehen bekomme, kann ich mich um die Codierung kümmern, was natürlich ein Sekundärproblem ist.

    Ok, vielen Dank, ich bin ein Stück weiter. In den DevTools (Chrome/Windows) unter "Network" kann ich meine Frage 1 sehen.


    Hier der aktuelle Link: http://music-quiz.bplaced.net/o01.html


    Die Konsole meldet allerdings "Uncaught (in promise) SyntaxError: Unexpected token F in JSON at position 2". Und dieses "F" ist das "F" des Wortes "Frage" in meinem PHP-Code. Dieser sieht nun wie folgt aus:



    Die PHP-Datei enthält nur dieses Stück Code und keinerlei HTML-Elemente - ist das richtig? Und ohne es begründen zu können, habe ich das Gefühl, dass der PHP-Code für mein Vorhaben nicht korrekt ist. Ich hatte ihn mir ergoogelt, um überhaupt erst einmal etwas aus der DB zu bekommen, aber das scheint nicht das Richtige zu sein. Hier müsste ich wieder Eure Hilfe in Anspruch nehmen, vielen Dank!


    ---


    Nachtrag: Bis gestern war meine PHP-Datei noch ein komplettes HTML-Dokument mit dem PHP-Script im Body. Das erste unerwartete Zeichen, das von der Konsole gemeldet wurde, war ein "<", also vermutlich die öffnende Klammer von <!DOCTYPE html> – deswegen habe ich heute den gesamten HTML-Code entfernt, was hoffentlich nicht falsch war.

    Danke Dir, aber ich komme echt nicht mehr klar. Habe GET auf POST geändert:


    Code
    if (isset($_POST['id'])) {
        $id = $_POST['id'];
      } else {
        die("Bitte eine ?id übergeben");
      }


    Es ändert sich nichts. Und den Hinweis in #69 kapiere ich überhaupt nicht.


    Ach ja, heute mache ich den Rechner mit echtem Frust aus. HTML, CSS und auch ein bisschen JavaScript konnte ich ja noch autodidaktisch lernen, aber jetzt gerade fühle ich mich wie in Blinder, der ziellos mit seinem Stock die Gegend abtastet ...

    Sempervivum Vielen Dank, aber ich komme absolut nicht klar, Ich habe Deinen Code kopiert, den Namen meiner PHP-Datei eingetragen und versucht, einen Parameter anzupassen. Dabei kommt nichts Brauchbares heraus, vermutlich habe ich das alles nicht wirklich verstanden:


    http://music-quiz.bplaced.net/a02.html


    Hier der Code der referenzierten PHP-Datei. Ich denke nicht, dass sie für o. g. Verfahren überhaupt verwendbar ist.



    m.scatello Vielen Dank für den Tipp! Es steht alles auf UTF-8 (Verbindung, Datenbank, Tabelle, Dokumente). Die Umlaute funktionieren online trotzdem nicht. Auf meinem lokalen Server gibt es das Problem nicht.