Einfaches Script?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Einfaches Script?

    Hallo!

    Ich soll ein Script für ein Multi-Level-Marketing System erstellen.
    Das Script soll user aus einer Datenbank auslesen und als Downline-Baumstruktur darstellen.

    Ich dachte erst das sei super einfach als ich das alte script gesehen habe scheitere aber gerade an der logik was die schleifen angeht. Das ganze problem an der sache ist das es keine maximale Anzahl der Level gibt das heisst das Script soll so aufgebaut sein das es quasi unendlich viele level geben könnte.

    Wenn ein User einen neuen user hinzufügt wird dieser in der Struktur ein Level unter ihm angeordnet.

    Die mySQL Tabelle sieht etwa so aus:

    ID |.....uid.....|_level_|....upline...| name usw...
    1 | MaxM.....|.....1...|.....0.........| Max
    2 | MartaM...|.....2...|.....1.........| Marta
    3 | Martin M..|.....2...|.....1........| Martin
    4 | Martina M|.....3...|.....3........| Martina
    5 | Michael M|.....3...|.....2........| Michael
    6 | MareikeM|.....4...|.....5.........| Mareike
    7 | MiniM......|.....4...|.....5........| Mini


    Die Ausgabe als Baum soll dann etwa so aussehen:

    MaxM
    |_MartaM
    ...|_MichaelM
    ......|_MareikeM
    ......|_MiniM
    |_MartinM
    ...|_MartinaM

    Die Schleifen und alles was dazu gehört sollen so aufgebaut sein das unendlich Level möglich sind. Ich hatte schon ein paar ansätze bin aber irgendwo immer vor die Wand gelaufen.

    Für die Lösung sind auch änderungen an der Datenbank möglich also irgendwelche neuen Felder vielleicht die noch helfen würden oder so etwas...

    Ich würde mich über ein paar Ansätz voin euch riesig freuen. Ich kann im moment schon nicht mehr schlafen weil ich immer wieder über die Lösung dieses Problems nachdenke :-) Aber ich denke die Hardcore-Programmierer unter wuch werden das kennen.

    [COLOR=red]HILFE![/COLOR]

    Naja schonmal Danke im Vorraus!!!!!!!
    Zuletzt geändert von Koss0r; 08.08.2005, 10:02.

  • #2
    Ich hatte schon ein paar ansätze bin aber irgendwo immer vor die Wand gelaufen.
    und wie sind diese ??
    Bei Risiken und Nebenwirkungen fragen Sie Dr.Alban

    Kommentar


    • #3
      Such mal hier im Forum oder bei Google nach 'nested sets' oder 'menu_has_menu'.
      Zuletzt geändert von onemorenerd; 08.08.2005, 11:01.

      Kommentar


      • #4
        OkOKOk....
        versuchen wir es mal hiermit:

        Code:
        o----o----o---------------------------o-------o
        | L  | R  | Baum                      | level |
        |----+----+---------------------------+-------|
        | 1  | 32 |  1  .wurzel              | 1    |
        | 2  | 7  |  2  .  .Home              | 2    |
        | 3  | 4  |  4  .  .  .Impressum      | 3    |
        | 5  | 6  |  3  .  .  .Kontakt        | 3    |
        | 8  | 25 |  5  .  .Autos            | 2    |
        | 9  | 14 |  7  .  .  .VW            | 3    |
        | 10 | 11 |  8  .  .  .  .Bentley    | 4    |
        | 12 | 13 |  9  .  .  .  .Skoda      | 4    |
        | 15 | 22 | 10  .  .  .BMW            | 3    |
        | 16 | 21 | 14  .  .  .  .Mini        | 4    |
        | 17 | 18 | 15  .  .  .  .  .Motor    | 5    |
        | 19 | 20 | 17  .  .  .  .  .Getriebe | 5    |
        | 23 | 24 |  6  .  .  .Mercedes      | 3    |
        | 26 | 31 | 11  .  .Farben            | 2    |
        | 27 | 28 | 12  .  .  .Blau          | 3    |
        | 29 | 30 | 13  .  .  .Schwarz        | 3    |
        o----o----o---------------------------o-------o
        Bei dem Wunsch, 'Mini' mit der ID 14 zu öffnen, setzt du folgende Anfrage:

        SELECT a.page_id , a.page_l , a.page_r , a.page_title
        FROM pages AS a
        INNER JOIN pages AS b ON (a.page_l <= b.page_l AND a.page_r >= b.page_r)
        WHERE b.page_id = 14
        ORDER BY a.page_l

        Das Ergebnis:
        Code:
        o---------o--------o--------o------------o
        | page_id | page_l | page_r | page_title |
        |---------+--------+--------+------------|
        | 1      | 1      | 32    | wurzel    |
        | 5      | 8      | 25    | Autos      |
        | 10      | 15    | 22    | BMW        |
        | 14      | 16    | 21    | Mini      |
        o---------o--------o--------o------------o
        4 rows in set (0.002 sec)
        Mittels Having klausel baust du es weiter...

        Aus.

        | page_l | page_r |
        | 1 | 32 |
        | 8 | 25 |
        | 15 | 22 |
        | 16 | 21 |

        wird.

        level <= 2
        OR (a.page_l > 8 AND a.page_r < 25 AND level = 2+1)
        OR (a.page_l > 15 AND a.page_r < 22 AND level = 3+1)
        OR (a.page_l > 16 AND a.page_r < 21 AND level = 4+1)

        Wobei die wurzel mit level <= 2' oder 'level = 2' statisch sein kann.



        Jetzt nochmal ein paar Abfragen für Dich....



        Das ist der ganze Baum:

        SELECT pages1.page_l AS L,
        pages1.page_r AS R,
        CONCAT(LPAD(pages1.page_id, 2 ,' ') ,
        REPEAT(' .', COUNT(*) ),
        pages1.page_title) AS Baum ,
        COUNT(*) AS level

        FROM pages AS pages1,
        pages AS pages2

        WHERE pages1.page_l BETWEEN pages2.page_l AND pages2.page_r

        GROUP BY pages1.page_l ;
        Code:
        o----o----o-----------------------o-------o
        | L  | R  | Baum                  | level |
        |----+----+-----------------------+-------|
        | 1  | 28 |  1  .wurzel          | 1    |
        | 2  | 7  |  2  .  .Home          | 2    |
        | 3  | 4  |  4  .  .  .Impressum  | 3    |
        | 5  | 6  |  3  .  .  .Kontakt    | 3    |
        | 8  | 21 |  5  .  .Autos        | 2    |
        | 9  | 12 | 10  .  .  .BMW        | 3    |
        | 10 | 11 | 14  .  .  .  .Mini    | 4    |
        | 13 | 14 |  6  .  .  .Mercedes  | 3    |
        | 15 | 20 |  7  .  .  .VW        | 3    |
        | 16 | 17 |  8  .  .  .  .Bentley | 4    |
        | 18 | 19 |  9  .  .  .  .Skoda  | 4    |
        | 22 | 27 | 11  .  .Farben        | 2    |
        | 23 | 24 | 12  .  .  .Blau      | 3    |
        | 25 | 26 | 13  .  .  .Schwarz    | 3    |
        o----o----o-----------------------o-------o
        14 rows in set (0.09 sec)
        -------------------------------------------------------

        Alle ab 'Autos':

        SELECT pages1.page_l AS L,
        pages1.page_r AS R,
        CONCAT(LPAD(pages1.page_id, 2 ,' ') ,
        REPEAT(' .', COUNT(*) ),
        pages1.page_title) AS Baum ,
        COUNT(*) AS level

        FROM pages AS pages1,
        pages AS pages2

        WHERE pages1.page_l BETWEEN pages2.page_l AND pages2.page_r
        AND pages2.page_l BETWEEN 8 AND 21

        GROUP BY pages1.page_l ;
        Code:
        o----o----o--------------------o-------o
        | L  | R  | Baum              | level |
        |----+----+--------------------+-------|
        | 8  | 21 |  5  .Autos        | 1    |
        | 9  | 12 | 10  .  .BMW        | 2    |
        | 10 | 11 | 14  .  .  .Mini    | 3    |
        | 13 | 14 |  6  .  .Mercedes  | 2    |
        | 15 | 20 |  7  .  .VW        | 2    |
        | 16 | 17 |  8  .  .  .Bentley | 3    |
        | 18 | 19 |  9  .  .  .Skoda  | 3    |
        o----o----o--------------------o-------o
        7 rows in set (0.08 sec)
        -------------------------------------------------------

        Nur die Kinder von 'Autos':

        SELECT pages1.page_l AS L,
        pages1.page_r AS R,
        CONCAT(LPAD(pages1.page_id, 2 ,' ') ,
        REPEAT(' .', COUNT(*) ),
        pages1.page_title) AS Baum ,
        COUNT(*) AS level

        FROM pages AS pages1,
        pages AS pages2

        WHERE pages1.page_l BETWEEN pages2.page_l AND pages2.page_r
        AND pages2.page_l BETWEEN 8 AND 21

        GROUP BY pages1.page_l
        HAVING level = 2 ;
        Code:
        o----o----o------------------o-------o
        | L  | R  | Baum            | level |
        |----+----+------------------+-------|
        | 9  | 12 | 10  .  .BMW      | 2    |
        | 13 | 14 |  6  .  .Mercedes | 2    |
        | 15 | 20 |  7  .  .VW      | 2    |
        o----o----o------------------o-------o
        3 rows in set (0.09 sec)
        -------------------------------------------------------

        Die Kinder von 'Autos' und 'Autos' selber:

        SELECT pages1.page_l AS L,
        pages1.page_r AS R,
        CONCAT(LPAD(pages1.page_id, 2 ,' ') ,
        REPEAT(' .', COUNT(*) ),
        pages1.page_title) AS Baum ,
        COUNT(*) AS level

        FROM pages AS pages1,
        pages AS pages2

        WHERE pages1.page_l BETWEEN pages2.page_l AND pages2.page_r
        AND pages2.page_l BETWEEN 8 AND 21

        GROUP BY pages1.page_l
        HAVING level <= 2 ;
        Code:
        o----o----o------------------o-------o
        | L  | R  | Baum            | level |
        |----+----+------------------+-------|
        | 8  | 21 |  5  .Autos      | 1    |
        | 9  | 12 | 10  .  .BMW      | 2    |
        | 13 | 14 |  6  .  .Mercedes | 2    |
        | 15 | 20 |  7  .  .VW      | 2    |
        o----o----o------------------o-------o
        4 rows in set (0.05 sec)

        -------------------------------------------------------


        So.... Vielleicht hilft dir das weiter...


        Gruß

        David
        Die meiste Unwissenheit könnte besiegt werden. Wir eignen uns nur deshalb keine Kenntnisse an, weil wir sie nicht wünschen.

        Kommentar


        • #5
          [PHP5]

          @ Arni

          Hab meine Ansätze erstmal nicht gepostet weil ich dachte das ich euch damit beinflussen würde und ihr dann genauso vor die wand lauft...

          Also mein Ansatz war eigentlich das erst bei der Ausgabe quasi aufzuschichten mit for-schleifen wobei das Wurzel-Level statisch wäre aber da bin ich auch schon hengen geblieben denn dann müsste es ja so viele vorschleifen ineinander verschachtelt geben wie es lebel gibt. Wenn man jetzt eine maximal anzahl an leveln hätte wäre das kein problem aber man kann ja meines wissens nach schlecht for-schleifen dynamisch ineinander verschachteln.. das wär auch ziemlich wirsch..

          ja das was so mein Gedanke...

          @Yooda
          Ja danke schonmal das ist ja schonmal recht Umfangreich.
          Ich hab nur noch ein Problem damit mich in deinen Vorschlag reinzudenken. Woher kommen die Zahlen "L" und "R" zu den zahlen hab ich irgendwie keinen bezug gefunden. Und was hat es mit dem ausdruck "page" in den Abfragen auf sich? Ist das einfach der Tabellenname?

          Danke schonmal!!

          Kommentar


          • #6
            Naja, das sind die Werte der Tabelle...

            CREATE TABLE pages (
            page_id int(5) default NULL auto_increment,
            page_root int(5) NOT NULL default '0',
            page_l int(5) NOT NULL default '0',
            page_r int(5) NOT NULL default '0',
            page_title varchar(50) NOT NULL default ' ',
            PRIMARY KEY (page_id),
            UNIQUE KEY page_id(page_id)
            ) TYPE=MyISAM;



            INSERT INTO pages VALUES (1, 1, 1, 28, 'wurzel');
            INSERT INTO pages VALUES (2, 1, 2, 7, 'Home');
            INSERT INTO pages VALUES (3, 1, 3, 4, 'Kontakt');
            INSERT INTO pages VALUES (4, 1, 5, 6, 'Impressum');
            INSERT INTO pages VALUES (5, 1, 8, 21, 'Autos');
            INSERT INTO pages VALUES (6, 1, 9, 10, 'Mercedes');
            INSERT INTO pages VALUES (7, 1, 11, 16, 'VW');
            INSERT INTO pages VALUES (8, 1, 12, 13, 'Bentley');
            INSERT INTO pages VALUES (9, 1, 14, 15, 'Skoda');
            INSERT INTO pages VALUES (10, 1, 17, 20, 'BMW');
            INSERT INTO pages VALUES (11, 1, 22, 27, 'Farben');
            INSERT INTO pages VALUES (12, 1, 23, 24, 'Blau');
            INSERT INTO pages VALUES (13, 1, 25, 26, 'Schwarz');
            INSERT INTO pages VALUES (14, 1, 18, 19, 'Mini');



            Das Script, welches dies macht, willst Du nicht haben.




            Die Zahlen sind auch für die spätere Eingrenzung wichtig.


            Beispiel:

            [SCHNIPP]
            WHERE pages1.page_l BETWEEN pages2.page_l AND pages2.page_r
            AND pages2.page_l BETWEEN 8 AND 21

            GROUP BY pages1.page_l
            HAVING level <= 2 ;
            [SCHNAPP]

            Hierbei fällt dir vielleicht das BETWEEN 8 AND 21 auf...
            Es dient der Eingrenzung der Datensätze mittels einer oberen und einer unteren Grenze.
            Du hast demnach die Möglichkeit, einen Knoten auszulesen, indem du die
            Grenzen bestimmst. In dem Fall wäre das Ergebnis:

            Code:
            o----o----o------------------o-------o
            | L  | R  | Baum            | level |
            |----+----+------------------+-------|
            | 8  | 21 |  5  .Autos      | 1    |           <----- Hier ist die Grenze des Elternknotens...
            | 9  | 12 | 10  .  .BMW      | 2    |
            | 13 | 14 |  6  .  .Mercedes | 2    |
            | 15 | 20 |  7  .  .VW      | 2    |
            o----o----o------------------o-------o
            schaue dir mal die Grenzen an an. Es sind die Grenzen 8 und 21.
            Dass die Werte L und R mittels PHP bestimmt werden müssen, sollte klar sein. Aber das ist wieder ein anderes Thema
            Die meiste Unwissenheit könnte besiegt werden. Wir eignen uns nur deshalb keine Kenntnisse an, weil wir sie nicht wünschen.

            Kommentar


            • #7
              gut also das mit der Tabelle ist jetzt klar...

              ich weiß nicht vielleicht is das einfach zu hoch aber um die Frage nochmal umzuformulieren wo kommen die zahlen denn her? z.b. 8 und 21 klar das die mit php bestimmt werden nur woher???

              Kommentar


              • #8
                Ok, daher weht der Wind. Aber da werde ich nicht nocheinmal das Rad neu
                erfinden, sondern auf eine Grafik verweisen, die dir helfen sollte.

                http://www.develnet.org/embed/nestedsets6.gif
                Die meiste Unwissenheit könnte besiegt werden. Wir eignen uns nur deshalb keine Kenntnisse an, weil wir sie nicht wünschen.

                Kommentar


                • #9
                  Und da ich nicht die Befugnis habe zu editieren, weil ich vor langer langer Zeit mal einen Beitrag gelöscht habe,
                  muss ich diesen Post "anfügen" und dir dieses Wundervolle Tutorial ans Herz legen.

                  http://www.develnet.org/36.html
                  Die meiste Unwissenheit könnte besiegt werden. Wir eignen uns nur deshalb keine Kenntnisse an, weil wir sie nicht wünschen.

                  Kommentar


                  • #10
                    Danke Yooda!!!

                    Das Tutorial ist Großartig!! Sehr gut erklärt... damit wirds klappen danköööö!!!!

                    Kommentar

                    Lädt...
                    X