Beiträge von Sempervivum

    Zitat

    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.

    Eine Schleife ist genau genommen überflüssig, weil Du ja in deinem Fall den Datensatz für genau eine ID aus der Datenbank liest und dabei kann nur eine Zeile im Ergebnis sein. D. h. dies dürfte den Zweck erfüllen:

    Von den ersten Zeilen ist dieses:

    $id = $_POST['id'];

    erforderlich, weil wir ja die ID für die DB-Abfrage brauchen. Die Fehlerbehandlung könnte man noch ausgefeilter machen, aber jetzt weißt Du ja, dass man die Ausgabe des Skripts im Netzwerk-Tab sehen kann und für das Debugging dürfte das genügen.

    Zitat

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

    Das fett formatierte ist genau der Kern der Sache und wir sind ja gerade dabei, das aufzubauen.

    Dieses verstehe ich nicht: "Ich kann derzeit lokal einen JSON-String in eine PHP-Datei laden", jedenfalls wenn Du damit meinst, einen JSON-String aus einer Datei zu laden.

    Auch mit PDO ist die Ausgabe in JSON kein Problem:

    Dann hast Du das Array genau in dem Format, wie es vorher in dem Javascript-Quiz war.

    Edit: Das fetch vergessen, Du kannst es sicher hinzu fügen.

    PS: Ich habe einen kurzen Blick auf dein früheres Skript mit dem Quiz geworfen und dieses z. B. könntest Du gut wieder verwenden:

    Code
            function buildQuestions() {
                document.getElementById('nrQuestion').innerHTML = i + 1;
                document.getElementById('question').innerHTML = questions[i].question;
                for (let j = 0; j < questions[i].answers.length; j++) {
                    document.getElementById('answer' + (j + 1)).innerHTML = questions[i].answers[j];
                }
                answerRight.style.display = 'none';
                end.style.display = 'none';
            }
    Zitat

    In den DevTools (Chrome/Windows) unter "Network" kann ich meine Frage 1 sehen.

    Das ist schon Mal sehr gut.

    Zitat

    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.

    Das liegt daran, dass das Skript JSON erwartet. Diese Zeile:

    return res.json();

    dekodiert den Text vom Server als JSON. Deine Ausgabe ist jedoch kein JSON, daher der Fehler.

    Jetzt gibt es eine grundsätzliche Entscheidung zwischen zwei Wegen, die Du einschlagen kannst:

    1. Das PHP-Skript das HTML generieren lassen, das der Browser direkt anzeigen kann. So ist es jetzt.
    2. Das PHP-Skript ein Array mit den Daten generieren lassen und dieses im JSON-Format an den Client bzw. den Browser übertragen. Das sieht auf den ersten Blick komplizierter aus, könnte dir aber unterm Strich Arbeit ersparen, weil dein früheres Skript die Daten auch aus einem Array gezogen hat und daraus das HTML generiert. Und möglicher Weise könntest Du diesen Code teilweise wieder verwenden.

    Um das mit #69 konkret zu machen: Da Du jetzt den POST-Parameter 'id' ausliest, musst Du ihn mit dem selben Namen an den Server schicken:

    Code
        const params = new FormData();
        params.append('id', '1');

    Das Ganze ist ein wenig undurchsichtig, weil man von der Serverantwort zunächst nichts zu sehen bekommt. Da ist jedoch das Network-Tab Gold wert, weil man sich dort sofort die Antwort ansehen kann, egal was im Browser alles fehl schlägt.

    Sehr hilfreich sind immer die Entwicklerwerkzeuge, als erstes ein Blick in die Console:

    Zitat

    Unexpected token < in JSON at position 0

    Das bedeutet, dass die Antwort vom Server kein valides JSON enthält.

    Als nächstes ein Blick in das Netzwerk-Tab, dort kann man sich die Antwort vom Server ansehen wenn man auf die Zeile mit dem Skriptnamen klickt:

    D. h. er hat die ID nicht gefunden.

    Der PHP-Code liefert dann des Rätsels Lösung: Die ID wird aus den GET-Parametern ausgelesen, gesendet mit fetch wird jedoch ein POST-Parameter.

    Wenn Du das PHP auf POST änderst, dürften wir einen Schritt weiter sein.

    Zitat

    Was ich bisher nicht wirklich verstanden habe: Wie kriege ich diese Daten in ein Javascript, um daraus wieder eine Interaktion zu erstellen?

    Das geht mit Ajax, damit kannst Du die Daten eines PHP-Skriptes holen ohne die Seite neu zu laden. Es gibt dabei mehrere Varianten, ich empfehle die fetch-API:

    https://developer.mozilla.org/en-US/docs/Web…API/Using_Fetch

    Weil das ein wenig umfangreich ist und Du vieles, was dort diskutiert wird, zunächst nicht brauchst, hier ein einfaches Beispiel aus der Schublade:

    Bei mir funktioniert das, was Du bisher programmiert hast, schon: Bei Klick auf die erste Kachel ändert sich die Hintergrundfarbe auf blau.

    Was jetzt noch fehlt: Wenn Du den Eventlistener auf diese Weise inline notierst, musst Du das bei allen Elementen tun, so wie in deinem ersten Posting mit den Buttons:

    Code
         <div class="kasten">
            <div class="feld1" onclick="changeColor(this)">1</div>
            <div class="feld2" onclick="changeColor(this)">2</div>
            <div class="feld3" onclick="changeColor(this)">3</div>
            <div class="feld4" onclick="changeColor(this)">4</div>
          </div>

    (Man kann das auch anders mit addEventListener und Eventbubbling machen, aber wir wollen es für den Anfang nicht zu kompliziert machen :) )

    Der nächste Schritt wäre dann, ein Array mit den Farben anzulegen, versuche es.

    Du schriebst am Anfang:

    Zitat

    dass pro onclick auf die Kachel die background Farbe sich in einer bestimmten Reihenfolge ändert.

    Wenn das so ist, brauchst Du keinen Button sondern kannst den Eventlistener direkt für die Kachel registrieren.

    Zitat

    Habe aktuell die Schwierigkeit, dass ich das nur für ein Feld machen kann.

    Diese Schwierigkeit kannst Du lösen, indem Du der Funktion das geklickte Element übergibst.

    Es steht dann als Parameter in der Funktion zur Verfügung:

    Code
    function changeColor(tile) {
        // tile ist die geklickte Kachel
    }

    Weitere Hinweise: Lege die Farben in einem Array ab, siehe hier:

    https://developer.mozilla.org/de/docs/Web/Ja…l_Objects/Array

    Damit Du die Farben in der richtigen Reihenfolge umschalten kannst, musst Du die aktuelle Farbe bzw. den Index in dem Array speichern. Ich empfehle, das in einem data-Attribut zu tun, dann hast Du es gleich der jeweiligen Kachel zugeordnet:

    https://developer.mozilla.org/en-US/docs/Lea…data_attributes