Tom: Eine Schleife ärgert mich ;)

Hallo Forum,

ich bastle gerade an einem kleinem Perl-Programm, mit dessen Hilfe ich eine Linkliste erstellen möchte.
Die erste Variannte wurde dynamisch ausgegeben - alles kein Problem funktioniert prima. Nun möchte ich, dass die Seiten nicht dynamisch erstellt werden, sondern "on fly" vom Programm als Html ausgegeben,
verlinkt und abgespeichert werden. Und an der Stelle stehe ich wohl voll auf dem Schlauch. ;)

Ich habe eine MySql Tabelle mit dem Namen "rubriken". Diese habe ich unterteilt in die Spallten "katid"(Nummer der Kategorie) , "katname" (Name der Kategorie) und "katvon" (Unterkategorie von).

In der dynamischen Fassung habe ich als Startwert($stringnummer) einfach "0" übergeben, um alle Kategorien zu erhalten welche keine übergeordnete Kategorie hat und somit eine Hauptkategorie darstellt.

....SELECT * FROM rubriken WHERE katvon LIKE '$stringnummer' ORDER BY katname...blablaa

Ich durchsuche die Tabelle und filter alle Hauptkategorien heraus...

while (my $anfrage = $sth->fetchrow_hashref()){

$katid = ($anfrage->{katid});
$katvon = ($anfrage->{katvon});
$katname = ($anfrag->{katname});

............

}

Nun hab ich also die Namen der Hauptkategorien und die "katid". Würde ich nun dynamisch (also einfach verlinken) z.B.    print  "<A HREF=" rubrik=$katid">$katname</a><br>"; würde die while nocheinmal mit der übergebenen ID durchlaufen und alle Rubriken suchen, welche die angegeben ID als übergeordnete Kategorie hat.

Nun will ich das Ganze aber als statischen HTML abspeichern- sprich ich müsste mit einer Schleife diesen Vorgang so lange wiederholen, bis alle Kategorien zugeordnet sind. Ich weiss einfach nur nicht, wie ich diese Schleife nun am dümmsten ansetzen solle.....öhm ja, beim letzten Versuch ist mir mein PC zusammengebrochen, weil er sich zu tote "geSchleift" hat. ;o)

Vielleicht hat einer von Euch eine Idee wie man sowas am besten realisiert. Wäre wirklich dankbar für jeden
noch so kleine Tipp.

Viele Grüße,

Tom

  1. Hallo,

    ich weiß nicht ob ich dein Problem richtig verstanden habe...aber probier die sache doch mal mit einer funktion, die immer die unterkategorien
    einer übergebenen KatID sucht und rufe diese dann rekursiv auf mit der jeweiligen neuen KAtID.

    MfG
    Peter , der nicht sicher ist ob er helfen konnte

    1. Hallo Peter!

      Jau, ich drück mich immer recht umständlich aus, sorry. Ich versuch es nocheinmal ;)).

      Hier mal ein Beispiel : (hoffentlich wird es einigermaßen ordentlich angezeigt)

      katid             katname           katvon
      ----------------------------------------------------
      1                 suchmaschine        0
      2                 löffel              1
      3                 zitate              2

      Ich lass zuerst nach allen Kategorien suchen, welche
      "0" als übergeordnete Kategorie(katvon) hat.

      Dabei kommt heraus (als haupkategorie*): suchmaschine (katid=1). Dann wollte ich einfach hingehen und nach dieser Id's ebenfalls suchen (katvon 1).(Dynamisch funktioniert das ja, da der Besucher ja jedesmal eine katid übergibt)

      1 suchmaschine* (katvon = 0)
      -  2  löffel       (katvon = 1)
         -   3  zitate       (katvon = 2)

      Naja und genau da klemmt es :(. Sobald ich die Schleife
      verlasse bekomme ich nur den letzten Wert - also muss
      die übergabe und Weiterverarbeitung innerhalb der
      Schleife geschehen... und alle Versuche endeten dann im Chaos ;).

      Ja, da ich scheinbar zu doof dazu bin...

      Viele Grüße,

      tom

      Hä? Ist es schon wieder 9 Uhr - war doch erst schon # *g*

      1. Hallo Tom,

        Hier mal ein Beispiel : (hoffentlich wird es einigermaßen ordentlich angezeigt)

        katid             katname           katvon

        1                 suchmaschine        0
        2                 löffel              1
        3                 zitate              2

        Ich lass zuerst nach allen Kategorien suchen, welche
        "0" als übergeordnete Kategorie(katvon) hat.

        Dabei kommt heraus (als haupkategorie*): suchmaschine (katid=1). Dann wollte ich einfach hingehen und nach dieser Id's ebenfalls suchen (katvon 1).(Dynamisch funktioniert das ja, da der Besucher ja jedesmal eine katid übergibt)

        1 suchmaschine* (katvon = 0)

        »»  -  2  löffel       (katvon = 1)

        -   3  zitate       (katvon = 2)

        was du suchst, ist ein rekursiver Aufruf. Du mußt deine Datenbank Suche in eine Funktion packen, die sich selbst wieder aufruft. Das teuflische dabei sind die Variablen. Jede Instanz der Funktion muß ihr eigenes Set von Variablen benutzen, da sie sonst die Werte aus dem vorhergehenden Aufruf überschreiben würde.
        In Pel definierst du locale Variablen mit my varname;
        Definiere sie innerhalb deiner Funktion, dann haben sie die gleiche Lebensdauer wie die Instanz deiner Funktion.

        Hm, das war jetzt etwas trocken. hier ein Beispiel:

        suche(0);  # 0 ist Initialwert

        sub suche ($) {
          my (katvon) = @_;

        suche in Datenbank nach katvon;
          für alle katid {
             suche(katid);
             ...
          }
        }

        Beim ersten Aufruf von suche wird die Variable katvon mit 0 belegt und alle katid dazu gesucht. Für jede gefundene katid ruf suche sich selbst wieder auf und übergibt die gefundene katid als neuen Wert für katvon.
        Durch die Definition von my katvon wird bei jedem erneuten Aufruf von suche katvon nicht etwas überschrieben, sondern es wird jeweile eine neue Variable angelegt, die nur für die Dauer des aktuellen Durchlaufes von Suche existiert. Du kannst dir das wie einen Stapel Zettel vorstellen. Auf jedem Zettel steht der aktuelle Wert von katvon. Bei jedem Aufruf von suche nimmst du einen neuen Zettel , schreibst den aktuellen Wert drauf und legst ihn auf den Stapel. Ist der Durchlauf von suche beendet, dann nimmst du den obersten Zettel wieder fort.

        Viele Gruesse
          Kess

        1. Hallo Kess,

          vielen Dank! Damit kann ich wirklich was anfangen.
          Ich starte einfach das Unterprog ( &suche(..);
          und durchlaufe so alle Kats. Wobei ich dann innerhalb jedes Durchlaufes auch Dinge wie spätere Verzeichnisstruktur festlegen kann... und endlos ist's
          auch nicht. Ich hatte es zuerst ähnlich versucht doch bin ich am total falschen Ende (Denkfehler hoch Zehn)angekommen.

          Also nocheinmal vielen Dank!

          Gruß,
          Tom