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