power-box.de
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 29.02.2008, 22:49   #1
TP-Veteran
 
Benutzerbild von Guitar
 
Registriert seit: Nov 2001
Ort: Friedrichshafen am Bodensee
Guitar ist auf einem guten Weg

MySQL-Tabelle rekursiv auslesen


Hallo,

ich habe ein kleines Problem:

ich habe eine MySQL-Tabelle, die Produktkategorien enthält. Jede Kategorie kann beliebig viele Unterkategorien haben, jede Unterkategorie wieder beliebig viele weitere Unterkategorien usw. Die Tiefe der Verschachtelung ist nicht begrenzt.

Die Struktur der Tabelle ist wie folgt:

Feld:
catid
pid
tid
catname

catid ist die eindeutige ID-Nummer jeder Kategorie.
pid ist die ID der übergeordneten Kategorie
tid ist die ID der übergeordneten Kategorie des obersten Levels, welche immer die pid=0 hat
catname der Name der Kategorie

Ich versuche jetzt, eine Funktion zu bauen, die es mir erlaubt, von einer beliebigen Kategorie aus alle Unterkategorien zu ermitteln und in ein Array zu übergeben, dass danach ausgewertet werden kann.

Die Funktion sieht bis jetzt so aus:
PHP-Code:
function findsubcats($id,$liste) {
            
    global 
$db;
    
    
$query=$db->query("SELECT * FROM kategorien WHERE pid='$id'");
    
$anzahl=$db->num_rows($query);
    
    while (
$result=$db->fetch_array($query)) {
        
$id=$result[catid];
                
        
array_push($liste,$id);
                
        
findsubcats($id);
    }
    
    return 
$liste;

Aufgerufen wird die Funktion an einer beliebigen Stelle des Skripts über:
PHP-Code:
$subcats=findsubcats($catid
wobei $catid die ID einer beliebigen Kategorie sein soll.

Zurückgeben soll die Funktion ein Array mit allen Unterkategorien. Und eben diese Rückgabe funktioniert so nicht.

Wenn ich mir innerhalb der while-Schleife die Variable $id per echo anzeigen lasse, sehe ich, dass tatsächlich alle Subkategorien gefunden werden, aber der Aufbau des Arrays $liste funktioniert nicht.

Am Ende enthält $subcats nur die IDs der Subkategorien im ersten untergeordneten Level.

Ich hoffe, ich habe mich jetzt einigermaßen verständlich ausgedrückt

Hat jemand eine Idee, wo hier der Fehler liegt? Ich grübele jetzt schon seit 2 Tagen über Sache und komme alleine wohl nicht mehr weiter.

Gruß
Wolfgang
__________________
Gruß, Wolfgang

Webdesign Friedrichshafen
Guitar ist offline   Mit Zitat antworten


Alt 01.03.2008, 00:47   #2
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Oyten
DSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKE
Mach das bloß nicht rekursiv, sondern informiere Dich zum Thema "nested sets".
Das ist eine Technik beliebig tief verschachtelte Bäume resourcenschonend in Datenbanken abzulegen und auszulesen. Du wirst hier im Forum dazu fündig.
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank
DSB ist offline   Mit Zitat antworten
Alt 01.03.2008, 05:26   #3
TP-Moderator
 
Benutzerbild von Rizzo
 
Registriert seit: Aug 2004
Ort: Kaiserslautern
Rizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine User
Zitat:
Zitat von DSB Beitrag anzeigen
... sondern informiere Dich zum Thema "nested sets"....
Du wirst hier im Forum dazu fündig.
Genau, und zwar direkt eine Tür weiter im Tutorial Board: Nested Set
Rizzo ist offline   Mit Zitat antworten
Alt 01.03.2008, 10:36   #4
TP-Veteran
 
Benutzerbild von Guitar
 
Registriert seit: Nov 2001
Ort: Friedrichshafen am Bodensee
Guitar ist auf einem guten Weg
Okay, danke, ich werd mich mal schlau machen. Ist wohl tatsächlich besser geeignet. Blos dumm, dass die MySQL-Tabelle mit ca. 3000 Kategorien schon vorliegt
__________________
Gruß, Wolfgang

Webdesign Friedrichshafen
Guitar ist offline   Mit Zitat antworten
Alt 01.03.2008, 12:18   #5
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
erstell doch eine Umhängetabelle für Kategorien, dann brauchst Du keine Rekursion.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 01.03.2008, 13:19   #6
TP-Veteran
 
Benutzerbild von Guitar
 
Registriert seit: Nov 2001
Ort: Friedrichshafen am Bodensee
Guitar ist auf einem guten Weg
Zitat:
Zitat von steffenk Beitrag anzeigen
erstell doch eine Umhängetabelle für Kategorien, dann brauchst Du keine Rekursion.
Wie meinst du das?
__________________
Gruß, Wolfgang

Webdesign Friedrichshafen
Guitar ist offline   Mit Zitat antworten
Alt 01.03.2008, 13:28   #7
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
ich meine den Baum abzubilden, da gibt es mehrere Möglichkeiten, hier mal eine

PHP-Code:
$tree=array();
while(
$row=mysql_fetch_assoc($res)) {
   
$tree[$pid][]=$row['catid'];

jetzt kannst Du entweder in der Ursprungstabelle zu jeder Kategorie den Baum ablegen, z.B.
$cattree=serialize($tree[$catid]);
oder eine Kommaliste produzieren und in eine eigene Tabelle eintragen.

Sicher gibts noch mehr Möglichkeiten.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 04.03.2008, 11:29   #8
TP-Veteran
 
Benutzerbild von Guitar
 
Registriert seit: Nov 2001
Ort: Friedrichshafen am Bodensee
Guitar ist auf einem guten Weg
Nachdem ich mich jetzt mal näher mit dem Thema Nested Sets beschäftigt habe, habe ich mich entschlossen, dass Problem auf diese Weise zu lösen. Funktioniert bis jetzt einwandfrei. Und die Datenbank werde ich halt neu erstellen, ist zwar ein wenig aufwendig, aber ich denke, der Aufwand lohnt sich.

Vielen Dank für eure Tipps!
__________________
Gruß, Wolfgang

Webdesign Friedrichshafen
Guitar ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik
MySQL-Tabelle rekursiv auslesen MySQL-Tabelle rekursiv auslesen
« Aktuellster Eintrag aus mehreren Tabellen? | Voting System der besonderen Art? »

Stichworte
datenbank, mysql

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:24 Uhr.

Powered by: vBulletin Version 3.7 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd. / Search Engine Friendly URLs by vBSEO 3.2.0 ©2008, Crawlability, Inc.
Traum-Projekt.com | Suchen | Archiv | Impressum | Kontakt | | | Nach oben |



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67