Eine Schleife ärgert mich ;)
Tom
- datenbank
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
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
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
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 2Ich 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
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