datenbank rekursiv auslesen ?

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • datenbank rekursiv auslesen ?

    hallo,

    ich habe folgendes problem.
    habe eine tabelle mit "überschriften" für daten.
    soll heissen ... eine katalogisierung von dateien.
    jetzt gibt es dazu unterkategoriene. dabei wieder unterkategoriene, usw.

    hier die datenbank :
    id name top_id
    1 Feature 0
    2 Relay 0
    3 Manufactor / OEM 2
    4 Konturen 1
    5 Ford 3
    6 DC 3
    7 Opel 3
    8 VW 3
    10 Bosch 3
    11 Fuse 0
    12 Standard 5
    13 Micro 5
    14 Power 5
    15 4 way 12
    16 5 way 12
    17 Other 12


    heisst also zb. id 17 gehöhrt zu id 12, die unter 5, die unter 3 und die unter 2, welche die oberste ist.

    wie kann ich das nun so anzeigen :

    relay
    - kunden
    -- ford
    --- 3 polig

    -- opel
    --- 3 polig

    usw.

    wie kann ich das auslesen ? ich weiss ja nicht, wieviele unterkategorien später noch dazu kommen ?

    danke und gruß, oliver

  • #2
    schreibe eine funktion, die sich selbst aufruft bis gar keine Daten mehr zu holen sind. Die Abfrage lautet:

    select ... from deineTabelle where parent_id=aktuelle_id

    Die aktuelle ID muss du als Parameter übergeben. Das Ganze in geeignete Form ausgeben und fettich

    btw: du willst wahrscheinlich relais und nicht relay erfassen, oder?

    Comment


    • #3
      die frage, wie rufe ich in einer function , die function erneut auf ???
      bin noch etwas neu in dem ganzen.
      Last edited by engelolli; 14-09-2004, 11:33.

      Comment


      • #4
        überlege mal wie es am geeignetsten ist und poste was du bisher versuchst hast

        Comment


        • #5
          habs gerade mal so versucht.
          im moment ist die höchste "top_id" = 12.
          später werde ich diese dann vorher aus der DB suchen und setzten.
          aber erst mal von hand.

          wenn ich dann das aber so mache, komm ich nur in eine eindlosschleife.
          wenn die die abbreche kommt x mal "4 way". also die erste mit der id 12.

          PHP Code:
          $id=12;
          categries($id);
          function categries($id)
              {
              $sql_cat = "SELECT * FROM categories WHERE top_id=$id"; 
              $query_cat = mysql_query ($sql_cat);
              while ($row_cat=mysql_fetch_array ($query_cat))
                  {
                  ?>
                  <tr>
                      <td class="schrift"><?php echo $row_cat[name]; ?></td>
                  </tr>
                  <?php
                  $id
          =$row_cat[top_id];
                  if (
          $id!="0")
                      {
                      
          categries($id);
                      }
                  }
              }

          Comment


          • #6
            nun fast ....

            jetzt habe ich so gemacht :

            PHP Code:
            <?php
            categories
            (0,"");
            function 
            categories($id,$vortext)
                {
                
            $sql_cat "SELECT * FROM categories WHERE top_id=$id ORDER BY name"
                
            $query_cat mysql_query ($sql_cat);
                while (
            $row_cat=mysql_fetch_array ($query_cat))
                    {
                    
            ?>
                    <tr>
                        <td class="schrift"><?php echo $vortext.$row_cat[name]; ?></td>
                    </tr>
                    <?php
                    $sql_cat_1 
            "SELECT * FROM categories WHERE top_id=$row_cat[id] ORDER BY name"
                    
            $query_cat_1 mysql_query ($sql_cat_1);
                    while (
            $row_cat_1=mysql_fetch_array ($query_cat_1))
                        {
                        
            $vortext=$vortext."-";
                        
            categories($row_cat_1[id],$vortext);
                        }
                    }
                }
            ?>
            an sich klappt es ... aber nur fast.
            er zeigt mir nicht alle an, und auch die reihenfolge ist nicht so wie ich es will.
            HELP PLEASE

            so kommt es raus :
            Feature
            -Fuse
            -Relay
            --Bosch
            --DC
            --Ford
            -----4 way
            -----5 way
            -----Other
            -----Opel
            -----VW

            so soll es mal sein :

            Feature
            -konturen

            Relay
            -manufactur/oem
            --ford
            ---standard
            ----4 way
            ----5 way
            ----other
            ---micro
            ---power
            --dc
            --opel
            --vw
            --bosch

            fuse

            Comment


            • #7
              1. wo ist die DB-Verbindung deklariert?
              2. was soll denn die verschachtelte while? Die Unterkategorie liest die Funktion auch so aus. Du weisst ja nicht was rekursiv heisst, oder?

              Nimm Papier und Stift, zeichne den Ablauf Schritt für Schritt, dann wirst du sehen, dass dein 1. Entwurf schon fast richtig ist. Schmeisse die If-Anweisung raus, so dass nur noch der Aufruf selbst da steht und schau dir das Ergebnis an.

              Comment


              • #8
                zu 1:
                die db wird weiter oben declariert
                da wird die verbindung geöffnet und ganz unten geschlossen.

                zu 2:
                [i]Du weisst ja nicht was rekursiv heisst, oder?
                richtig

                habs mal aufgeschnappt, als ich verzeichnisse auslesen wollte.
                da habe ich mit dem brgriff zu tun gehabt.
                das habe ich auch mal hinbekommen.
                aber leider habe ich null plan, wie ich das nun mit der db machen soll.

                noch mehr aufzeichnen.
                ahbe schon x zettel vor mir.
                aber es funzt nicht richtig.

                ich habe es so versucht, das er so lange nach unten geht, bis er nix mehr findet. deswegen 2 schleifen.
                brauche ich nicht ?
                ich versteh nur noch bahnhof.
                3 stunden später und keinen schritt weiter

                Comment


                • #9
                  probiere mal:
                  PHP Code:
                  function categories($id)
                  {
                      global 
                  $connection;
                      
                  $sql_cat "SELECT * FROM categories WHERE top_id=$id"
                      
                  $query_cat mysql_query ($sql_cat,$connection) or die(mysql_error());
                      while (
                  $row_cat=mysql_fetch_array ($query_cat))
                          {
                          echo 
                  "\t<tr>\n\t\t<td>".$row_cat['name']."</td>\n\t</tr>\n";
                          
                  categories($row_cat['id']);
                          }
                  }
                  echo 
                  "<table>\n";
                  categories(0);
                  echo 
                  "</table>\n"
                  btw: Spaltenname=name ist böse, weil reserviertes Wort

                  Comment


                  • #10
                    PHP Code:
                    <?php
                    categories
                    (0);
                    function 
                    categories($id)
                        {
                        
                    $sql_cat "SELECT * FROM categories WHERE top_id=$id"
                        
                    $query_cat mysql_query ($sql_cat);
                        while (
                    $row_cat=mysql_fetch_array ($query_cat))
                            {
                            
                    ?>
                            <tr>
                                <td class="schrift"><?php echo $row_cat[name]; ?></td>
                            </tr>
                            <?php
                            categories
                    ($row_cat['id']);
                            }
                        }
                    ?>
                    es funzt.
                    aber warum

                    jetzt nur noch die striche davor, dann ist es fettich.

                    super !!!
                    danke Incognito

                    Comment


                    • #11
                      1. vergleiche die Fkt. von dir und von mir und ergänze bei deinem den Fehlerabfang bei DB-Abfrage
                      2. Rekursivfunktionen sind Speicherfresser (genauer gesagt: Stapelspeicher), also sei vorsichtig damit. Wenn du mit den Kategorien übertreibst, könnte es möglich sein, dass du den stack voll laufen lässt und das war's ja dann

                      Comment

                      Working...
                      X