php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2004

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 12.10.2004, 18:18  
Gast
 
Beiträge: n/a
Standard NESTED SETS dieses Thema sollte abgehakt werden

Hallo liebe Community freunde ich habe jetzt schon so viele Fragen zu Nested Sets gelesen das ich mich um dieses Thema bemüht habe.
Ich habe das Modul Nested Sets gelesen. und habe dementsprechen die Datenbank aufgebaut:

Code:
CREATE TABLE `node` (
  `node_id` int(10) unsigned NOT NULL auto_increment,
  `root_id` int(10) unsigned NOT NULL default '0',
  `payload` varchar(64) default NULL,
  `lft` int(10) unsigned NOT NULL default '0',
  `rgt` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`node_id`),
  KEY `root_id` (`root_id`)
) TYPE=MyISAM AUTO_INCREMENT=5 ;

#
# Daten für Tabelle `node`
#

INSERT INTO `node` VALUES (1, 1, 'A', 1, 8);
INSERT INTO `node` VALUES (2, 1, 'B', 2, 7);
INSERT INTO `node` VALUES (3, 1, 'C', 3, 4);
INSERT INTO `node` VALUES (4, 1, 'D', 5, 6);
Ich habe auch einen Test eintrag duchgeführt!

So jetzt habe ich die MySQL abfrage gestartet womit alle Childs und Levels ausgegeben werden.

Code:
SELECT node1.payload,
        IF ( node1.node_id = node1.root_id,
            round( (node1.rgt - 2) / 2, 0),
            round( ( (node1.rgt - node1.lft - 1) / 2), 0)
        ) AS children,
        COUNT(*) AS level

    FROM node AS node1,
         node AS node2
 
    WHERE node1.root_id = ".$id."
    AND node2.root_id = ".$id."

    AND node1.lft BETWEEN node2.lft AND node2.rgt 

    GROUP BY node1.LFT;
dabei werden alle Datenfelder ausgegeben.

Jezt stellt sich die eine Frage wie implementiere ich das Ganze in Php so das eine Menuestrucktur ausgegeben wird und die jeweiligen Childs eines Knotens jeweils nach einem klick angezeigt werden.

Die Abstände, die nach jedem Knoten kommen der seine Chils anzeigt
kann mann ganz leicht erstellen indem mann pro Level eine bestimmte anzahl an Leerzeichen oder andere Zeichen ausgibt:

PHP-Code:

while ($level <= 1)
{
     echo 
"";
     
$level $level 1;

somit fügt man für jedes Level einen Leezeichen ein bis die Levelanzahl 1 ist. Level 1 bedeutet des oberste node Level 2 die childs von dem Node in Level eins. (wir reden hier von einem Baum wie in der DB eingefügt)

Demnach sehen die Levels und die Chils in den beschriebenen Inserts so aus:
Code:
payload  children  LEVEL  
A              3        1 
B              2        2 
C              0        3 
D              0        3
________________________________________________-

Jetzt ist die Frage wie man das ganze in PHP Inplementiert.
Ich habe einen ansatz geleistet und würde mich freuen wenn dieses Script in zusammen arbeit alle Nested Sets Fragen Löst damit alle ein Tutorial haben um eine Baumstrucktur zu erstellen.

Mein ansatz war es erstmals die Ganzen Haupelemente aufzurufen. also die Nodes im Level 1.

PHP-Code:

// MENULEISTE   
    
$query_hauptstrucktur     " SELECT * FROM node WHERE node_id = root_id ORDER BY `node_id` ASC  LIMIT 0 , 30";
    
$result_hauptstrucktur    = @mysql_query($query_hauptstrucktur);
    
$num_hauptstrucktur        = @mysql_num_rows($result_hauptstrucktur);
    
    if (
$num_hauptstrucktur  1) {} else
    {
        for (
$i =0$i $num_hauptstrucktur$i++)
        {
            
$row_hauptstrucktur   =   @mysql_fetch_object($result_hauptstrucktur);
            echo 
"<a href=menue.php?id=".$row_hauptstrucktur->node_id."&level=2>" $row_hauptstrucktur->payload."</a>
"
;
            if ((
$_REQUEST['level'] != 1) && ($_REQUEST['id']==$row_hauptstrucktur->node_id))
            {
                
submenues($_REQUEST['id'], $_REQUEST['level']);
            }
        }
    } 
Hier übergebe ich in einem Link die Level Nummer und die ID die die Childs dieses Nodes Ausgeben sollen.

Die Funktion Submenue soll die Jeweiligen Childs mit der ID 2 Anzeigen und diese als echo unter das Haupmenue mit der selben root_id anzeigen.

PHP-Code:
function submenues ($id$level) {
    
$query_sub_menu     =
    
"SELECT node1.payload,
        IF ( node1.node_id = node1.root_id,
            round( (node1.rgt - 2) / 2, 0),
            round( ( (node1.rgt - node1.lft - 1) / 2), 0)
        ) AS children,
        COUNT(*) AS level

    FROM node AS node1,
         node AS node2
 
    WHERE node1.root_id = "
.$id."
    AND node2.root_id = "
.$id."

    AND node1.lft BETWEEN node2.lft AND node2.rgt 

    GROUP BY node1.LFT;"
;

    
$result_sub_menu    = @mysql_query($query_sub_menu);
    
$num_sub_menu        = @mysql_num_rows($result_sub_menu);
    if (
$num_sub_menu  1) {} else
    {
        for (
$i =0$i $num_sub_menu$i++)
        {
            
$row_sub_menu   =   @mysql_fetch_object($result_sub_menu);
            if (
$level 2)
            {
                
$count 2;
            while (
$level == $count)
            {
                
            }
            }
            if (
$level == $row_sub_menu->level)
            {
                    if (
$row_sub_menu->children == 0)
                    {
                        echo 
$row_sub_menu->payload $row_sub_menu->children $row_sub_menu->level ."
;
                    } else
                    {
                        
$setlevel $level 1;
                        echo 
"<a href=menue.php?id=".$id."&level=".$setlevel.">".$row_sub_menu->payload."</a>
"
;
                    }
            }
        }
    }

So bis hierhin bin ich ge kommen!
ich habe aber leider das Problem wenn ich auf den link im 2. Level Drücke verschwinden die Elemente vom 2. Level und es kommen die Elemente vom 3. Level zum erscheinen. Dies soll aber nicht so sein wenn ich die elemente im 2. Level anklicke sollen die elemente im 2. Level und die Elemente im 3. Level zu sehen sein. Die elemente im 1. Level werden ja sowieso durch meine erste MySQL abrage angezeigt.


Ich würde mich freuen wenn viele Leute an diesem Eintrag teinehmen könnten damit hier ein gutes Tutorium entsteht. Ich bitte nur einträge zu machen die diesem Thema weiterhelfen und keine unsinnigen angaben zu machen!


Danke nochmals Gruß

acarweb
 
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

 


Themen-Optionen
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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Nested Sets und viele Fragen... BartTheDevil89 Datenbanken 7 13.08.2008 10:18
[Erledigt] Thema anpinnen und Thema als gelesen markieren? litterauspirna PHP Tipps 2008 27 04.08.2008 11:19
Neues Thema und Eröffnungspost richtig zueinander in 2 Tabelen eintragen? litterauspirna PHP Tipps 2008 8 25.06.2008 13:37
nested set dbmodell subtrees verschieben raffnix Datenbanken 12 08.06.2008 13:27
Nested Sets oder Rekursion? litterauspirna PHP Tipps 2008 8 06.06.2008 16:57
Nested Sets in ein Mehrdimensionales Array Simon9990 PHP-Fortgeschrittene 2 29.10.2007 17:38
Nested Sets Query GSJLink Datenbanken 12 08.09.2007 10:55
SQL Warnung: 4 result set(s) not freed. daki Datenbanken 10 28.03.2006 17:00
Nested Sets und Silbings nightfreak Datenbanken 10 06.01.2006 13:58
Nested Sets History Sirke PHP-Fortgeschrittene 1 21.10.2005 08:50
erklärung gesucht: nested set query! Sirke Datenbanken 0 19.09.2005 17:24
Alternative zu Nested Sets fantast Datenbanken 1 16.08.2005 01:14
hilfe nested sets zapate Datenbanken 6 02.08.2005 02:58
Nested Sets mit Berechtigungen? daniel987 Datenbanken 3 07.06.2005 22:18
[Erledigt] Frage zu nested sets... PHP-Fortgeschrittene 2 04.03.2005 09:57

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
soll abgehackt werden, nested set neues auf dem markt, nested sets, nested sets children, nested sets 3 children

Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.