Ankündigung

Einklappen
Keine Ankündigung bisher.

Switch Return funktioniert nicht, wie gedacht.

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Switch Return funktioniert nicht, wie gedacht.

    Hallo mal wieder.

    Hab hier eine verschachtelte Abfrage, die so weit funktioniert.
    Die Idee ist dahinter, das man Grunddaten aus der DB holt und diese via SWITCH aufgelöst werden. Anhand der in SWITCH gefundenen Einträge, soll ein neues ARRAY Element erstellt werden, der die eigentlichen Daten zusammengefasst weitergeben soll.

    PHP-Code:
    db.query("SELECT * FROM hp", (errresult) => {
                if (
    result) {
                    if (
    result[0].hp_active === 1) {

                        const 
    websiteData = new Array();
                        const 
    data JSON.parse(result[0].hp_sites);

                        
    data.site.forEach(function (valueindexitems) {
                                switch (
    value.type) {
                                    case 
    'slideshow':
                                        
    console.log(value.items);
                                        break;
                                    case 
    'cards':
                                        break;
                                    case 
    'threepic':
                                        break;
                                    case 
    'box':
                                        return 
    db.query("SELECT * FROM hp_normal_box WHERE id=?", [value.items], (errresult) => {
                                            
    websiteData.push({ "box": {  "message"result[0].message } });
                                        });                                    
                                    case 
    'footer':
                                        break;
                                    default:
                                        return 
    null;
                                }
                            });

                        
    console.log(JSON.stringify(websiteData)) // <-- Hier ist nichts drin.
                        
    return ut.handleResponse(reqres200, {
                            
    homeJSON.stringify(websiteData)
                        });
                    }
                }
            }); 
    Setze ich unter dem websiteData.push ein console.log(websiteData), zeigt der mir den gewünschten Inhalt an.
    Leider aber nicht unten in console.log(JSON.stringify(websiteData)). Da wird mir ein leeres Array angezeigt. []

    Wo ist da mein Denkfehler?

    Terra

  • #2
    db.query() wird asynchron ausgeführt, das heißt dein console.log() wird ausgeführt, bevor db.query() fertig ist, folglich ist websiteData zu dem Zeitpunkt auch leer.

    Datenbankabfragen in Schleifen ist aber so oder so eine ganz schlechte Idee und das solltest du nicht machen. Hol dir alle Daten, die du brauchst, mit einer Abfrage, und nicht mit Einzelabfragen in einer Schleife.

    Könnte auch hilfreich sein: async / await

    Kommentar


    • #3
      So weit verstehe ich die Antwort.

      Meine Hauptabfrage sieht wie folgt aus:
      Code:
      {"site":[{"type":"slideshow", "items":["1", "2", "3"]}, {"type":"cards", "items":"1"}, {"type":"threepic", "items": "1"}, {"type":"cards", "items":"2"}, {"type":"box", "items": "1"}, {"type":"footer", "items": "1"}]}
      Die ganze Sache soll ein winziges CMS werden, wo die Webseite beliebig angepasst werden soll. Idee dahinter jetzt von mir, ich gebe vor, was alles zu sehen sein soll. Wie man auch sehen kann, hab ich da 2 Cards mit drin, mit verschiedenen Item IDs. Auch, wenn sich der zu ladenden Inhalt der einzelnen Boxen in grenzen halten wird, würde ich ungern zuerst ALLES laden, um daraus das rauszuholen, was ich zum anzeigen benötige.

      Muss doch auch einfacher gehen?!
      Werde auch nochmal schauen, wie das die anderen CMS das machen.

      Kommentar


      • #4
        Zitat von terra75 Beitrag anzeigen
        Auch, wenn sich der zu ladenden Inhalt der einzelnen Boxen in grenzen halten wird, würde ich ungern zuerst ALLES laden, um daraus das rauszuholen, was ich zum anzeigen benötige.
        Ich habe nicht gesagt, dass du ALLES laden sollst, sondern nur das, was du brauchst.

        Zitat von terra75 Beitrag anzeigen
        Muss doch auch einfacher gehen?!
        Werde auch nochmal schauen, wie das die anderen CMS das machen.
        Die Arbeiten wohl einfach mit einem JOIN in der Datenbank.

        SELECT * solltest du übrigens nicht verwenden, sondern ins SELECT immer genau die Spalten reinschreiben, die du im Ergebnis erwartest.

        Kommentar


        • #5
          Wie JOINT man denn was dynamisch aus der DB, wenn sich die Gegebenheiten ändern könnten? Habe schon gelesen, das man in der DB auch mit CASE arbeiten kann, was ja die SWITCH Anweisung gleicht.
          Code:
          SELECT OrderID, Quantity,
          CASE
              WHEN Quantity > 30 THEN "The quantity is greater than 30"
              WHEN Quantity = 30 THEN "The quantity is 30"
              ELSE "The quantity is under 30"
          END
          FROM OrderDetails;
          Nur dann müsste ich die Select Abfrage damit auch in eine Schleife legen, was ich ja nicht machen soll. Wie schon geschrieben, können ja 2 Blöcke aus der DB mit verschiedenen IDs benötigt werden. Die Abfrage oben fragt aber nur 1x ab.

          Das mit dem * mache ich immer, wenn ich teste. Am Schluss wird verfeinert.

          Kommentar


          • #6
            Zitat von terra75 Beitrag anzeigen
            Wie JOINT man denn was dynamisch aus der DB, wenn sich die Gegebenheiten ändern könnten?
            Dynamisch muss gar nichts gemacht werden, wenn das Datenbankdesign in Ordnung ist.

            Zitat von terra75 Beitrag anzeigen
            Habe schon gelesen, das man in der DB auch mit CASE arbeiten kann, was ja die SWITCH Anweisung gleicht.
            Code:
            SELECT OrderID, Quantity,
            CASE
            WHEN Quantity > 30 THEN "The quantity is greater than 30"
            WHEN Quantity = 30 THEN "The quantity is 30"
            ELSE "The quantity is under 30"
            END
            FROM OrderDetails;
            Nur dann müsste ich die Select Abfrage damit auch in eine Schleife legen, was ich ja nicht machen soll. Wie schon geschrieben, können ja 2 Blöcke aus der DB mit verschiedenen IDs benötigt werden. Die Abfrage oben fragt aber nur 1x ab.
            Ich denke du verläufst dich da in eine Sackgasse. Es wäre einfacher, wenn du erstmal das JavaScript komplett weg lassen würdest, solange das Datenbankdesign noch nicht wirklich ausgereift und die notwendigen Datenbankabfragen noch nicht fixiert sind.

            Zitat von terra75 Beitrag anzeigen
            Das mit dem * mache ich immer, wenn ich teste. Am Schluss wird verfeinert.
            Also das Forum soll sich mit den groben Brocken begnügen? Oder wie kann man das verstehen?

            Kommentar


            • #7
              das Forum soll sich mit den groben Brocken begnügen?
              Ich glaube, die Diskussion entwickelt sich in die falsche Richtung.

              Wahrscheinlich hast du aber Recht, das ich mir mein Datenbankdesign in dem Zuge nochmal überarbeiten sollte.
              Hab da auch schon eine Idee, welche eine Schleife innerhalb des JS komplett ausschließt.
              Manchmal sind die simpelsten Ideen, doch die besseren.

              Terra

              Kommentar

              Lädt...
              X