Announcement

Collapse
No announcement yet.

SQL-Query übergeht Anforderung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL-Query übergeht Anforderung

    Hallo,

    ich hatte dieses Problem schonmal in zwei anderen Foren geschildert, worunter sich in einem Forum von den Beiden durchaus kompetente Hilfe geboten hatte, jedoch keine Lösung für das / mein Problem. Es geht darum, das ich Kategorien und Themen in eine Tabelle einfließen lasse, unterscheiden kann man die Kategorie von einem Thema durch das Feld - art (INT)11. Ich lese also zunächst die Kategorien aus:

    $query = mysql_query("SELECT * FROM areas WHERE art='1' ORDER BY id ASC");

    ... werfe die Ergebnisse in eine Schleife ...

    while($fetch = mysql_fetch_array($query)) {

    ... gestalte es mir ein wenig übersichtlicher ...

    $areaid = ("".$fetch['id']."");

    ... lese dann die Themen / Subkategorien aus ...

    $query_subareas = mysql_query("SELECT * FROM areas WHERE art='0' AND parentid='".$areaid."' ORDER BY id ASC");

    ... um dessen Ergebnisse natürlich auch zu "schleifen" ...

    while($fetch_subareas = mysql_fetch_array($query_subareas)) {

    ... und auszugeben ...

    PHP Code:
    echo [...]; 
    ... dann schließe ich die Schleife der Subareas wieder ...

    }

    ... und beende Querys und Ausgaben ...

    echo [...];

    }

    Das eigentliche Proiblem daran ist jedoch, dass das Ergebniss meinen Wünschen sich leider nur ähnelt. Mit meinem Programmcode sieht die Ausgabe folgendermaßen aus:

    - area 1 (auch als kat bezeichnet)
    - area 1.1
    - area 1.2
    - area 1.3
    - area 2 (zweite kategorie)
    - area 1.1 (eigentlich area der kat 1)
    - area 1.2 (eigentlich area der kat 1)
    - area 1.3 (eigentlich area der kat 1)
    - area 2.1
    - area 2.2
    - area 2.3
    - area 3 (dritte kategorie)
    - area 1.1 (eigentlich area der kat 1)
    - area 1.2 (eigentlich area der kat 1)
    - area 1.3 (eigentlich area der kat 1)
    - area 2.1 (eigentlich area der kat 2)
    - area 2.2 (eigentlich area der kat 2)
    - area 2.3 (eigentlich area der kat 2)
    - area 3.1
    - area 3.2
    - area 3.3

    So möchte ich das jedoch nicht haben, denn vorgestellt hatte ich mir das so wie im nun folgenden Beispiel:

    - area 1 (auch als kat bezeichnet)
    - area 1.1
    - area 1.2
    - area 1.3
    - area 2 (zweite kategorie)
    - area 2.1
    - area 2.2
    - area 2.3

    Man erkennt, das die Themen / Subkategorien sich zwar ordnungsgemäß in die gewünschten Kategorien verteilen, dazu jedoch auch die vorhergegangenen Themen anderer Katgeorien. Wer kann mir dabei helfen?

  • #2
    Poste mal deine Datenbankstruktur, dann sehen wir weite

    Comment


    • #3
      Hallo,

      hier der Auszug aus phpMyAdmin:

      `areas` (
      `id` int(11) NOT NULL auto_increment,
      `parentid` int(11) NOT NULL,
      `title` varchar(60) collate latin1_general_ci NOT NULL,
      `art` int(1) NOT NULL,
      `themacount` int(11) NOT NULL,
      `guests` int(1) NOT NULL,
      `lastcommenter` varchar(50) collate latin1_general_ci NOT NULL,
      `lastcommenterid` int(11) NOT NULL,
      `lastthema` varchar(60) collate latin1_general_ci NOT NULL,
      `lastthemaid` int(11) NOT NULL,
      `commentcount` int(11) NOT NULL,
      PRIMARY KEY (`id`

      Comment


      • #4
        Sieht fast so aus, als würdest du beim durchlaufen der Schleife für die x.1, x.2 usw. den Inhalt, der vorher drinstand, nicht löschen.
        Also, wenn du die Kategorieschleife hast, einfach vorher den Speicher (variable) für die Subkategorien löschen und dann wieder auffüllen.
        Hoffe, du weißt, was ich meine..

        Comment


        • #5
          Das hatte ich probiert mit

          mysql_free_result($query_subareas);

          und

          mysql_free_result($query);

          an den dafür vorgesehenen Orten / Positionen

          Comment


          • #6
            Anmerkung: Quellcode wäre super!
            Also, du durchläufst deine Schleife für die Kategorien, dort füllst du irgendwo eine variable (ein array, ein string, ...) mit den Daten für die Kategorie.
            Dann durchsuchst du die DB wieder nach Unterkategorien, dass klappt ja auch beim ersten durchlauf, ABER: beim 2ten durchlauf stehen noch die Daten vom ersten DL drin, PLUS die neuen, beim 3ten DL dann die von DL 1und2, dann zusätzlich die vom 3ten DL.
            sowas:
            while kat=kategorien do
            suche subkategorien für kat.id
            while subkat=subkategorien
            string .= subkat.name
            // mehrmehrmehr
            endwhile
            endwhile
            ausgabe string

            Besser wäre es, string vor den durchläufen zu löschen, damit es nicht zu solchen anreihungen kommt.
            while kat=kategorien do
            suche subkategorien für kat.id
            while subkat=subkategorien
            string[subkat.id]=""
            string[subkat] .= subkat.name
            // mehrmehrmehr
            endwhile
            endwhile
            ausgabe string[subkat1]
            ausgabe string[subkat2]
            usw

            Comment


            • #7
              Hallo,

              zunächst einmal danke ich Dir für Deine bisherige Unterstützung. Hier folgt nun der Quellcode:

              $query = mysql_query("SELECT * FROM areas WHERE art='1' ORDER BY id ASC");
              while($fetch = mysql_fetch_array($query)) {
              $areaid = ("".$fetch['id']."");

              $query_subarea = mysql_query("SELECT * FROM areas WHERE art='0' AND parentid='".$areaid."' ORDER BY id ASC");
              while($fetch_subarea = mysql_fetch_array($query_subarea)) {

              eval ("\$index_area_subareas .= \"".gettemplate("index_area_subareas")."\";");
              }

              mysql_free_result($query_subarea );

              eval ("\$index_area .= \"".gettemplate("index_area")."\";");

              }

              mysql_free_result($query);

              Comment


              • #8
                Das Problem liegt beim
                eval ("\$index_area_subareas .= \"".gettemplate("index_area_subareas")."\";");
                Dort fügst du stets daten nur an, aber nach dem Durchlauf einer Kategorie musst den Speicher der Variable wieder löschen, damit für jede Kategorie auch nur die Subs angezeigt werden, die für diese Kat gültig sind.
                Also, ohne dass ich hier PHP auf habe, es müsste so gehen:
                eval ("\$index_area_subareas .= \"".gettemplate("index_area_subareas")."\";");
                }
                mysql_free_result($query_subarea );
                <b>$index_area_subareas = "";</b>
                eval ("\$index_area .= \"".gettemplate("index_area")."\";")

                Comment


                • #9
                  Hallo,

                  wenn ich das wie von Dir Vorgeschlagene so einfüge, erscheint bei mir keine Ausgabe mehr der Kategorien und der Subareas / Themen

                  Comment


                  • #10
                    Okay, das Problem an sich habe dir oben beschrieben (fehlende zwischenlöschung der ergebnisse).
                    Du musst nun bei meinem fettgeschriebenen vorher eine Ausgabe erzwingen, damit du den speicher freigeben kannst, ohne das (anzeige)daten verloren gehen. dann wäre deine variable wieder frei um nur die daten entgegenzunehmen, die relevant sind.
                    (Ich nehme einfach mal an, du gibst die daten _nach_ deinem geposteten code aus)

                    Comment


                    • #11
                      "(Ich nehme einfach mal an, du gibst die daten _nach_ deinem geposteten code aus)."

                      Das ist absolut korrekt, zwar weise ich vorher noch via eval die Ausgabepositionen zu, die aber kommen erst am Ende des Quellcodes in Verwendung mittels:

                      eval ("show (\"".gettemplate("index")."\");");

                      Erst in diesem Template inkludiere ich die Ausgaben via den bestimmten Variablen. Nun ist lediglich das Problem, das ich zwar mit echo arbeiten könnte, ich aber dennoch lieber auf Templates zugreifen möchte, denn nicht umsonst habe ich hier auf Templates hin programmiert. Hm, nun stehe ich in einem Wald voller Bäume und finde keinen Weg heraus :

                      Comment


                      • #12
                        Als Lösung könnte ich dir die verwendung von arrays empfehlen, ist zwar nicht schön, sollte aber gehen:
                        Anstelle von
                        eval ("\$index_area_subareas .= \"".gettemplate("index_area_subareas")."\";");
                        Das ganze als array speichern:
                        subarea[areaid] .= subareadaten;
                        dann das ganze am ende mit dem template in einer for schleife wieder ausgeben.
                        Sollte gehen..

                        Comment


                        • #13
                          Und das scheint mir nun eine Nummer zu hoch zu sein, oder aber ich bin schon zu sehr in den Wald hineingelaufen, um nun überhaupt noch einen Bruchteil verstehen zu können

                          Comment


                          • #14
                            <b>$arrkat = array();
                            $arrsub = array();
                            $counter=0;</b>
                            $query = mysql_query("SELECT * FROM areas WHERE art='1' ORDER BY id ASC");
                            while($fetch = mysql_fetch_array($query)) {
                            $areaid = ("".$fetch['id']."");

                            $query_subarea = mysql_query("SELECT * FROM areas WHERE art='0' AND parentid='".$areaid."' ORDER BY id ASC");
                            while($fetch_subarea = mysql_fetch_array($query_subarea)) {
                            <b>$counter=0;
                            $arrsub[$fetch['id'][$counter]=$fetch['title'];</b>
                            }
                            mysql_free_result($query_subarea );

                            eval ("\$index_area .= \"".gettemplate("index_area")."\";");

                            }

                            mysql_free_result($query);
                            }
                            <b>var_dump($arrsub);</b>
                            --------------
                            Mit arrsub kannst du dann weiterarbeiten, sieh dir einfach mal die Ausgabe mittels var_dump an.
                            Bin erst morgen wieder da, spiel mal was mit den arrays rum, dann wird es bald funktionieren.
                            P.S. Keine Garantie, dass der Code stimmt, hab alles aus dem Kopf geschrieben, da hier kein php vorhanden :

                            Comment


                            • #15
                              Hallo,

                              ich habe nun tagelang rumexperimentiert, bin jedoch nicht zum Ergebnis gekommen. Entweder die Veränderungen wirken sich nicht aus, oder aber es wird nichts angezeigt oder nur die Kategorien, nicht die Subareas

                              Comment

                              Working...
                              X