datenbank rekursiv auslesen ?

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

  • 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?

    Kommentar


    • #3
      die frage, wie rufe ich in einer function , die function erneut auf ???
      bin noch etwas neu in dem ganzen.
      Zuletzt geändert von engelolli; 14.09.2004, 12:33.

      Kommentar


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

        Kommentar


        • #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);
                      }
                  }
              }

          Kommentar


          • #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

            Kommentar


            • #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.

              Kommentar


              • #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

                Kommentar


                • #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

                  Kommentar


                  • #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

                    Kommentar


                    • #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

                      Kommentar

                      Lädt...
                      X