Thema: Nested Set
Einzelnen Beitrag anzeigen
Alt 07.07.2009, 16:11  
sharp
Erfahrener Benutzer
 
Registriert seit: 20.08.2008
Beiträge: 119
sharp befindet sich auf einem aufstrebenden Ast
Standard Nested Set

Hallo,
ich habe vor einpaar Tagen die "Nested Sets" entdeckt und wollte damit nur ma zum Test was kleines ausprobieren. Da ich Probleme beim einlesen des Baumes hatte habe ich erst ma Google abgegrast, jedoch dort nur Beispiele gefunden wo bereits Daten vorhanden sind.
Linkliste:
dev.iordanov.net
http://www.tutorials.de/
http://www.traum-projekt.com/

http://reeg.junetz.de/
http://phpperformance.de/
http://www.php-resource.de/


Und natürlich ha ich auch die Forums Suche verwendet leider auch ohne erfolg.

Mein Problem ist nun das beim einlesen der Daten falsche lft(Links) und rgt(rechts) werte erzeugt werden.
Hier mein Script:
PHP-Code:
function mySQLCon(){
    
$host="localhost";
    
$user="xxxxxxxxxxx";
    
$pass="xxxxxxxxxxx";
    
$db="test";        
    
$con=mysqli_connect($host,$user,$pass);
    
mysqli_select_db($con,$db);    
    return 
$con;
}

function 
setRoot($root,$lft=1,$rgt=2){
    
#mysqli_query(mySQLCon(),"TRUNCATE TABLE `test`;");
    
$sql2="INSERT INTO tree (name,lft,rgt) VALUES ('$root',$lft,$rgt);";    
    
mysqli_query(mySQLCon(),$sql2);     
}
function 
createTree($tree,$lft=1,$rgt=1,$first=1){
    
$root=$tree;
    echo 
$root."<br>";

    if(
is_dir($root)){
        
$inserts=0;
        if(
$dh=opendir($root)){
            while ((
$item readdir($dh)) !== false){
                if(
$item!="."&&$item!=".."){
                    
$rgt++;
                    
$lft++;
                    echo 
"<b>$rgt</b><br>";
                    if(
$first){                                                      
                        
$sql="UPDATE tree SET rgt=rgt+2 WHERE rgt >= $rgt;";
                        
$sql.="INSERT INTO tree (name,lft,rgt) VALUES ('$item', $rgt, $rgt+1);";
                    }else{                    
                        
$sql="UPDATE tree SET rgt=rgt+2 WHERE rgt >= $rgt;";
                        
$sql.="UPDATE tree SET lft=lft+2 WHERE lft > $rgt;";
                        
$sql.="INSERT INTO tree (name,lft,rgt) VALUES ('$item', $rgt, $rgt +1); ";
                    }
                    echo 
"<pre>";var_dump($sql,$rgt);echo "</pre>";
                    
mysqli_multi_query(mySQLCon(),$sql);
                    
$inserts++;
                    if(
is_dir("$root/$item")&&"$root/$item"!=$root){                   
                        
$count=createTree("$root/$item",$lft,$rgt,0);
                        
$sql2="UPDATE tree SET rgt=rgt+($count+1) WHERE name='$item';";
                        
mysqli_query(mySQLCon(),$sql2);
                    }
                }
            }
        }
    }
}
setRoot("Saeugetiere");
createTree("Saeugetiere"); 
Ich wer wende aus dem Beispiel von "http://www.klempert.de/nested_sets/" die Baumstruktur:
Code:
Saeugetiere
---Nagetiere
---Primaten
------Affen
------Halbaffen
Welche soweit auch funktioniert:
Code:
+------+-------------+-------+------+
|  id  |     name    |  lft  |  rgt |
+------+-------------+-------+------+
|  1   | Saeugetiere |   1   |  10  |
|  2   | Nagetiere   |   2   |   3  |
|  3   | Primaten    |   3   |   7  |
|  4   | Affe        |   4   |   5  |
|  5   | Halbaffe    |   5   |   6  |
+------+-------------+-------+------+
Wenn ich jedoch in Nagetiere nun "Maus" hinzufüge zerhaut es das ganze Konstrukt
Code:
+------+-------------+-------+------+
|  id  |     name    |  lft  |  rgt |
+------+-------------+-------+------+
|  1   | Saeugetiere |   1   |  12  |
|  2   | Nagetiere   |   2   |   9  |
|  3   | Maus        |   3   |   4  |
|  4   | Primaten    |   4   |   5  |
|  5   | Affe        |   3   |   7  |
|  6   | Halbaffe    |   5   |   6  |
+------+-------------+-------+------+
Man beachte das nun "Nagetiere" auch "Primaten" als Kinderelement enthält sowie das "Affe" zum Elternelement von "Primaten" wird. Hat jemand ne Idee wo das Problem hier liegt?

Gruß
sharp
sharp ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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