"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

(PHP) rekursiver Unterprogrammaufruf

Dr. Creutzfeld 06.01.2004 - 10:22 984 15
Posts

Dr. Creutzfeld

Bloody Newbie
Registered: Jan 2004
Location: wien
Posts: 11
Ich steh derzeit vor dem Problem dass ich eine ganze Latte von Artikeln ausgeben möchte, die jedoch "verzeichnisartig" verschachtelt sind..
Jeder Artikel bezieht sich auf nen anderen.

artikel
 `-artikel
    |-artikel
    |-artikel
    |  `-artikel
    `-artikel
artikel
 |-artikel
 |-artikel
 `-artikel



würde folgender Kode funktionieren?
Code: PHP
function links($quelle = 0)
  {
  $ressourceid = mysql_query("SELECT kurztitel, ID FROM artikel WHERE quelle=$quelle SORT BY reihenfolge ASC;");
  $datensatz = mysql_fetch_assoc($ressourceid));

  while($datensatz)
    {
    printf('%s',$datensatz[kurztitel]);
    links($datensatz[ID]);
    }
  }

was der kode machen soll: Den Kurztitel des ersten Datensatzes ausgeben, desen Spalte 'Quelle' den Wert 0 hat.
Dann: Den Kurztitel der Datensätze ausgeben, die sich auf den ebengenannten Datensatz beziehen, dh. deren Spalte 'Quelle' den Wert der 'ID' des ersten Datensatzes hat.



PS: Ich weis dass da vermutlich noch einige Fehler drin sind bzw. einiges fehlt ("OR die(mysql_error());" gehört da afaik noch wo rein), jedoch gehts mir ATM nur um die Logik die dahinter steckt.. Irgendwelche Tippfehler interessieren mich atm net.
Wenn damit fertig -> Weitermachen mit dem Ausgeben der Datensätze mit 'quelle'=0.
Bearbeitet von Dr. Creutzfeld am 06.01.2004, 11:34

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
ja, also es fehlt dir mal ein funktionsname...
dann glaub ich kaum dass dir jemand helfen kann wenn er deinen db-aufbau net kennt - abgesehen davon glaub ich nicht dass dein code auch nur annähernd das gewünschte ergebnis liefert

Dr. Creutzfeld

Bloody Newbie
Registered: Jan 2004
Location: wien
Posts: 11
Zitat von watchout
ja, also es fehlt dir mal ein funktionsname...
ROFL, ganz übersehn :lol:


@datenbankaufbau:
eine einzige Tabelle, Spaltennamen:
- ID
- quelle
- reihenfolge
- kurzname
- Autor
- Inhalt


der Inhalt von 'quelle' ist die 'ID' des übergeordneten Artikels.

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
ah, versteh - sollte deine funktion zufällig "links" heissen?

Dr. Creutzfeld

Bloody Newbie
Registered: Jan 2004
Location: wien
Posts: 11
worin meiner Meinung nach die Schwierigkeit besteht:

$datensatz = mysql_fetch_assoc($ressourceid)); gibt nach der Reihe sämtliche Datensätze aus auf die der SQL-Befehl zutrifft.
Gerade wenn der erste Datensatz geliefert wurde, wird dieser erste Befehl jedoch von einem zweiten unterbrochen.. (Nämlich genau dann, wenn sich links($quelle) selber neu startet)
Jedoch muss nachher mit der Ausgabe des ersten Befehls fortgefahren werden..

Geht das?


Zitat von watchout
ah, versteh - sollte deine funktion zufällig "links" heissen?
jup. Hab den ersten Post editiert..

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Code: PHP
function links($quelle = 0)
{
  $ressourceid = mysql_query("SELECT kurztitel, ID FROM artikel WHERE quelle=$quelle SORT BY reihenfolge ASC;");

  while($datensatz = mysql_fetch_assoc($ressourceid)))
  {
    printf('%s',$datensatz[kurztitel]);
    links($datensatz[ID]);
  }
}
die abfragen sollten sich nicht gegenseitig stören, da $ressourceid eine lokale (und daher auf den aktuellen funktionsaufruf beschränkte variable is und sich mysql an eben dieser id orientiert

ich hab da noch einen fehler von dir ausgebessert ;)

wenn die funktion links heisst is es ja doch nicht so falsch :p

Dr. Creutzfeld

Bloody Newbie
Registered: Jan 2004
Location: wien
Posts: 11
Zitat von watchout
die abfragen sollten sich nicht gegenseitig stören, da $ressourceid eine lokale (und daher auf den aktuellen funktionsaufruf beschränkte variable is und sich mysql an eben dieser id orientiert
ah, sehr gut..
ich hätte ansonsten nämlich keine Ahnung gehabt wie ich das sonst noch realisieren könnte ;)


btw: Sollte es nicht egal sein, ob $datensatz als argument von while() oder als eigener Befehl deklariert wird?

dio

Here to stay
Registered: Nov 2002
Location: Graz
Posts: 4883
also ich habs so gelöst, dass ich die unterteilungen abgefragt habe, und zu jeder unterteilung eine abfrage die wieder nach unterteilungen sucht... hab allerdings eine andere db struktur :)

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von Dr. Creutzfeld
btw: Sollte es nicht egal sein, ob $datensatz als argument von while() oder als eigener Befehl deklariert wird?
nein, weil bei einem aufruf der funktion nur ein datensatz des ergebnisses zurückgegeben wird.

Dr. Creutzfeld

Bloody Newbie
Registered: Jan 2004
Location: wien
Posts: 11
sry, versteh ich jetzt nicht ganz..

wenn mysql_fetch_assoc($ressourceid) FALSE zurückliefert, wird dieses FALSE doch eh $datensatz zugewiesen..
und wenn $datensatz als argument von while() angegeben wird, sollte dies doch schlußendlich imho aufs selbe rauskommen? :confused:

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
ja, aber is die schleife dann ne endlosschleife, weil $datensatz _immer_ true is

wennst es net checkst glaub mir einfach - es stimmt :rolleyes: irgendwann geht dir vielleicht der knopf auf, lies dir am besten die doku ein paarmal durch ;)

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14594
ich habe das problem bei mir so gelöst:

jeder artikel hatte in der db ein feld namens SUB. das enthielt die ID von der untergruppe. Dann spang er zu der id, gab alles aus, checkte ob SUB vorhanden war ==> wenn ja ==> sprung zu SUB ==> wenn nein => raus

tomstig

OC Addicted
Avatar
Registered: Nov 2003
Location: /home/tomstig/
Posts: 1341
was er mit der schleife machen wollte geht nur mit arrays [z.b. while($ergebnis = mysql_fetch_assoc($wie_auch_immer)){ ]

und zur mysql abfrage: mach "SELECT * FROM ..."... weil obst du nur einen haben willst oder viele, ausgeben musst du immer mit $ergebnis['wie_auch_immer']...

ich hab mich auch grad mit so was beschäftigt, nur bei mir war es ein menü mit untermenüs.... wenn du mir ein bisschen genauer erklärst was du willst (hab es nicht ganz verstanden), kann ich kurz schauen, ob der quellcode passt und ihn hier reinstellen ;)

Dr. Creutzfeld

Bloody Newbie
Registered: Jan 2004
Location: wien
Posts: 11
Zitat von watchout
ja, aber is die schleife dann ne endlosschleife, weil $datensatz _immer_ true is
ich glaub ich habs jetzt verstanden..

"mysql_fetch_assoc($ressourceid)" liefert pro Aufruf einen kompletten Datensatz, beim nächsten Aufruf dann den nächsten Datensatz usw.
Da "$datensatz = mysql_fetch_assoc($ressourceid));" jedoch außerhalb der while-Schleife steht, wird "mysql_fetc..." nur einmal aufgerufen
-> $datensatz behält immer den Inhalt des ersten Datensatzes
-> $datensatz ist immer TRUE.

stimmt diese Erklärung?


@tomstig: Ich denke hier ist es besser erklärt als ich es könnte:
http://tut.php-q.net/recursion.html#u4 (circa eine A4-Seite runterscrollen)

Wenn du dich fragst warum ich nicht gleich den Code nehme der dort abgebildet ist:
1. ist er mir zu aufgebläht
2. will ichs selber lernen (O_o)

Aus diesem Grund muss ich auch vorerst auf dein Angebot mir deinen Code zu überlassen verzichten..

aber Danke für das Angebot! :)

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
creutzfeld, is das ne hausaufgabe oder wie?

edit: ja, hört sich gut an ;)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz