3 Stimmen

Eine dynamischere Art der Verschachtelung mehrstufiger Kategorien

Ich versuche, eine Möglichkeit zu schaffen, eine unendliche Menge von verschachtelten Kategorien abzurufen und anzuzeigen.

Table Example

Jetzt könnte ich sie wie folgt auswählen (nicht getestet, nicht wichtig):

$resulttable1 = mysql_query("SELECT name, id FROM categories WHERE childof=0");
while($rowtable1 = mysql_fetch_array($resulttable1)){ 
$cat1 = $rowtable['name']; 

$resulttable2 = mysql_query("SELECT name, id FROM categories WHERE childof=$rowtable1[id]");
while($rowtable2 = mysql_fetch_array($resulttable2)){ 
$cat2 = $rowtable2['name']; 

$resulttable3 = mysql_query("SELECT name, id FROM categories WHERE childof=$rowtable2[id]");
while($rowtable3 = mysql_fetch_array($resulttable3)){ 
$cat3 = $rowtable3['name'];
}
}
}

Was aber, wenn ein Benutzer mehr als 3 "Ebenen" der Verschachtelung wünscht? Wie kann ich den mysql SELECT so gestalten, dass er eine unendliche Anzahl von verschachtelten Kategorien abruft?

UPDATE: Ok, mit die Verbindung paul vorausgesetzt, ich habe es so hinbekommen:

endless nesting mysql

Es ist nicht wirklich wichtig, wie die Felder lft und rgt funktionieren, da sie automatisch aktualisiert werden, wenn Sie Kategorien einfügen oder entfernen. Es ist aber interessant, das herauszufinden. Außerdem ist der erste Eintrag ein statischer Wert. Er ist im Grunde nur der Anfang des Baums, lassen Sie ihn einfach so stehen wie er ist. Mein Skript unten nicht Echo es auf der Grundlage seiner Titel "Produkte".

<?php
include_once("config.php");

display_tree('products');

function display_tree($root) {  

echo'<table>';

    // retrieve the left and right value of the $root node  
    $result = mysql_query('SELECT lft, rgt FROM tree '.  
                           'WHERE title="'.$root.'";');  
    $row = mysql_fetch_array($result);  

    // start with an empty $right stack  
    $right = array();  

    // now, retrieve all descendants of the $root node  
    $result = mysql_query('SELECT title, lft, rgt FROM tree '.  
                           'WHERE lft BETWEEN '.$row['lft'].' AND '.  
                           $row['rgt'].' ORDER BY lft ASC;');  

    // display each row  
    while ($row = mysql_fetch_array($result)) {
        // only check stack if there is one  
        if (count($right)>0) {  
            // check if we should remove a node from the stack  
            while ($right[count($right)-1]<$row['rgt']) {  
                array_pop($right);  
            }  
        }  
        // display indented node title  
        $repeatamount = (count($right)) - 1;
        if($repeatamount < 0){ $repeatamount = 0; }

        if($row['title'] != 'products'){
        echo'<tr>';
        echo "<td>".str_repeat('-->',$repeatamount ).$row['title']."</td>";  
        echo'</tr>';
        }

        // add this node to the stack  
        $right[] = $row['rgt'];  
    }
echo'</table>';
}
?>

Es wird etwas angezeigt wie:

example

Und dies ist ein Beispiel für das Einfügen einer neuen Kategorie: addnew.php?parent=3&title=Shooter Dies würde die Kategorie "Shooter" unter "PC" hinzufügen (die wiederum unter "Spiele" zu finden ist).

<?php
include_once("config.php");

if(isset($_GET['parent']) && is_numeric($_GET['parent']) && isset($_GET['title']))
{
    $parent = $_GET['parent'];
    $title = mysql_real_escape_string($_GET['title']);
    mysql_query("INSERT INTO tree (parent, title) VALUES ('$parent', '$title')");
    rebuild_tree(0, 0);
}

function rebuild_tree($parent, $left) {     
        // the right value of this node is the left value + 1     
        $right = $left+1;     

        // get all children of this node     
        $result = mysql_query('SELECT id FROM tree '.     
                               'WHERE parent="'.$parent.'";');     
        while ($row = mysql_fetch_array($result)) {     
            // recursive execution of this function for each     
            // child of this node     
            // $right is the current right value, which is     
            // incremented by the rebuild_tree function     
            $right = rebuild_tree($row['id'], $right);     
        }     

        // we've got the left value, and now that we've processed     
        // the children of this node we also know the right value     
        mysql_query('UPDATE tree SET lft='.$left.', rgt='.     
                     $right.' WHERE id="'.$parent.'";');     

        // return the right value of this node + 1     
        return $right+1;     
    }

    ?>  

Ich hoffe, das hilft allen, die das Gleiche suchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X