phpbar.de logo

Mailinglisten-Archive

[php] Rekursive Abfragen f�r Kategorien

[php] Rekursive Abfragen f�r Kategorien

Florian Grell grell at werk4.net
Mi Okt 12 09:50:48 CEST 2011


Ich empfehle f�r so etwas immer wieder gerne:
http://phpbar.de/w/Baumstruktur_aus_DB_in_Array_abbilden

Damit liest Du in einem ersten Schritt den gesamten Baum in einer
Abfrage aus, speicherst diesen in einem Array und arbeitest
anschlie�end nur noch mit diesem Array. Keine weiteren SQL-Abfragen.
Gerade wenn du die Struktur mehr als einmal ben�tigst, ist das sehr n�tzlich.

Sch�ne Gr��e aus der M�ggenkampstra�e,
Florian Grell
----------------------------------
Webentwicklung
WERK4.1 Neue Medien GmbH
M�ggenkampstra�e 7a-9a
20257 Hamburg
+49 [0]40 �40 17 444 -70 Telefon
+49 [0]40 �40 17 444 -99 Fax
http://www.werk4.net
----------------------------------
Gesch�ftsf�hrer: Frank Wilde, Alessandro Eggers, Marcus Reisiger, Bj�rn Kaas
Amtsgericht Hamburg | HRB 82829
Die vorstehende Nachricht ist vertraulich, nur f�r den Adressaten bestimmt
und darf nicht unbefugt an Dritte weitergegeben werden. Sollten Sie nicht
der vorgesehene Adressat dieser Nachricht sein, l�schen Sie bitte die
Nachricht sofort und benachrichtigen Sie den Absender. Rechtsgesch�ftlich
bindende Erkl�rungen werden durch diese Nachricht nicht abgegeben.



Am 12. Oktober 2011 08:20 schrieb Trawell Mildor <trawell.mildor at gmail.com>:
> Guten Morgen Andr�
>
> Danke f�r den Code.
> Werd mich heut mal damit auseinandersetzen und schauen was der so macht.
>
> Gruess, Trawell
>
> Am 11. Oktober 2011 20:13 schrieb A. Sauder <andre.sauder at netzwerkcenter.ch>
> :
>
>> Hallo
>>
>> Also deine L�sung funktioniert wohl schon auch, nur hast du das Problem
>> so bald du
>> eine Ebene Tiefer rein willst.
>> Denn das was du machst ist nicht wirklich Rekursiv, sondern mehr
>> Verschachtelt.
>>
>> Hier mal ein ungepr�ftes Beispiel einer rekursiven Methode und deren
>> Aufruf.
>>
>> <?PHP
>>
>> $categoryThree = array(); �// initiieren des Array
>> $categoryThree = getCategorysFromParent($categoryThree, 0, 0); �//
>> erster aufruf der rekursiven funktion
>>
>> // durchlaufen des erzeugten Array mit Mengenkontrolle
>> if(count($categoryThree) > 0){
>> � � foreach($categoryThree as $k1 => $v1){
>> � � � � echo '<div
>> style="margin-left:'.($v1['lefel']*5).'px;'>'.$v1['kategorie'].'</div>';
>> // ausgabe der Kategorie mit Einr�ckung
>> � � }
>> }
>>
>> /**
>> �* Liest alle Kategorieen zu einem Parent aus und ergaenzt das
>> ThreeArray entsprechend.
>> �* Die Chield Kategorieen werden direkt unter dem Parent in das Array
>> geschrieben
>> �*
>> �* $categoryThree = Array mit den bereits vorhandenen Kategorieen
>> �* $parentId = ID der uebergeortneten Kategorie
>> �* $level = Ebene auf der sich die auszulesenden Kategoreen befinden
>> �*/
>> function getCategorysFromParent($categoryThree, $parentId, $level){
>>
>> � � $sql = 'SELECT *
>> � � � � FROM kategorien
>> � � � � WHERE id_parent = '.$parentId.'
>> � � � � ORDER BY id_kategorie ASC';
>> � � $categories = mysql_query($sql , $conDB) or die(mysql_error());
>> � � while ($row = mysql_fetch_array($categories, MYSQL_ASSOC)) {
>>
>> � � � � $categoryThree[$row['id']] = $row; �// record in den Three
>> speichern
>> � � � � $categoryThree[$row['id']]['level'] = $level; �// level mit
>> speichern
>>
>> � � � � getCategorysFromParent($categoryThree, $row['id_kategorie'],
>> $level+1); �// Aufruf der gleichen Methode mit neuer ID und erh�ten
>> Level
>> � � }
>> }
>>
>> ?>
>>
>>
>> Dieses Beispiel k�nnte dir so etwas raus geben:
>>
>> Kategorie A
>> � Kategorie A.A
>> � Kategorie A.B
>> Kategorie B
>> Kategorie C
>> � Kategorie C.A
>> � Kategorie C.B
>> � Kategorie C.C
>> ...
>>
>> Hoffe konnte dir etwas helfen.
>>
>> Gruss Andr�
>>
>> Am 11.10.2011 18:02, schrieb Trawell Mildor:
>> > Guten Abend zusammen.
>> >
>> > hab mich mal mit rekursiven Abfragen besch�ftigt..und ja ich
>> > weiss..Nestet
>> > Sets sind sicher besser :)
>> >
>> > Also..ich m�chte einen Kategorienbaum mit drei Ebenen
>> >
>> > und hab dazu folgendes Script gebastelt..so zum Verst�ndnis..und w�rd
>> > gern
>> > Meinungen von Profis dazu lesen :)
>> >
>> > Das Script gibt nur die Kategorien in der entsprechenden Reihenfolge
>> > aus...also ohne Men� usw.
>> >
>> > Ich bin PHP Neuling und �ber Tips immer aufgeschlossen.
>> >
>> > Gruss, Trawell
>> >
>> >
>> > <?php require_once('../Connections/conDB.php'); ?>
>> > <?php
>> > mysql_select_db($database_conDB, $conDB);
>> > ?>
>> > <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
>> > http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
>> > <html xmlns="http://www.w3.org/1999/xhtml">
>> > <head>
>> > <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
>> > <title>Unbenanntes Dokument</title>
>> > </head>
>> >
>> > <body>
>> > <?php
>> >
>> > /* Erste Abfrage mit Parent ID = 0 , also Hauptkategorien */
>> > $query_maincategories = "SELECT * FROM kategorien WHERE id_parent = 0
>> > ORDER
>> > BY id_kategorie ASC";
>> > $maincategories = mysql_query($query_maincategories, $conDB) or
>> > die(mysql_error());
>> > $row_maincategories = mysql_fetch_assoc($maincategories);
>> > do {
>> > echo '<h1>'.$row_maincategories['kategorie'].'</h1><br />';
>> > $zahl = $row_maincategories['id_kategorie'];
>> > �/* Zweite Abfrage mit Parent ID = aus der ersten Abfrage von
>> > id_kategorie
>> > */
>> > $query_subcategories = "SELECT * FROM kategorien WHERE id_parent =
>> > $zahl
>> > ORDER BY id_kategorie ASC";
>> > $subcategories = mysql_query($query_subcategories, $conDB) or
>> > die(mysql_error());
>> > $row_subcategories = mysql_fetch_assoc($subcategories);
>> > do {
>> > echo '<h2>'.$row_subcategories['kategorie'].'</h2><br />';
>> > $zahl = $row_subcategories['id_kategorie'];
>> > �/* Dritte Abfrage mit Parent ID = aus der zweiten Abfrage von
>> > id_kategorie
>> > */
>> > $query_subsubcategories = "SELECT * FROM kategorien WHERE id_parent =
>> > $zahl
>> > ORDER BY id_kategorie ASC";
>> > $subsubcategories = mysql_query($query_subsubcategories, $conDB) or
>> > die(mysql_error());
>> > $row_subsubcategories = mysql_fetch_assoc($subsubcategories);
>> > do {
>> > if (isset($row_subsubcategories['kategorie']))
>> > {
>> > echo '<h3>'.$row_subsubcategories['kategorie'].'</h3><br />';
>> > }
>> > }
>> > while ($row_subsubcategories = mysql_fetch_assoc($subsubcategories));
>> > }
>> > while ($row_subcategories = mysql_fetch_assoc($subcategories));
>> > }
>> > while ($row_maincategories = mysql_fetch_assoc($maincategories));
>> >
>> > ?>
>> > </body>
>> > </html>
>> > <?php
>> > mysql_free_result($maincategories);
>> > mysql_free_result($subcategories);
>> > mysql_free_result($subsubcategories);
>> > ?>
>>
>> --
>> ** Allgemeine deutschsprachige PHP-Liste: php at phpbar.de **
>> Informationen: http://www.phpbar.de
>> http://lists.phpbar.de/mailman/listinfo/php
>>
> --
> ** Allgemeine deutschsprachige PHP-Liste: php at phpbar.de **
> Informationen: http://www.phpbar.de
> http://lists.phpbar.de/mailman/listinfo/php
>

php::bar PHP Wiki   -   Listenarchive