Entwicklung einer Downloaddatenbank, Probleme mit Kategorien

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

  • Entwicklung einer Downloaddatenbank, Probleme mit Kategorien

    Hallo,

    ich habe eine Standalone-Lösung einer Download-Datenbank gesucht, aber nichts geeignetes gefunden. Ich habe mich nun entschieden, eine eigene Datenbank zu schreiben.

    Von der Sache her habe ich alle Mittel, die ich brauche, aber jetzt komme ich an der Kategorieverwaltung nicht weiter.

    Ich möchte die Download in Kategorien verwalten. Es soll u.a. möglich sein, auch Unterkategorien anzulegen. Dazu habe ich mir überlegt, Beim Anlegen einer Kategorie auswählen zu können, ob die Kategorie im Root eingerichtet werden soll oder als Unterkategorie unter eine bestehende Kategorie angelegt werden soll.

    Dazu speichere ich Im Falle dessen, dass es eine Unterkategorie werden soll in der Datenbank im Feld "oberkatid" die ID der übergeordneten Kategorie.

    Vom Prinzip her ist das noch kein Problem. Ich möchte nun aber beim Anlegen eines Downloads die Kategorie über ein Dropdown auswählen. In diesem Pulldown sollen sdie Kategorien Alphabetisch geordnet sein, aber Unterkategorien unterhalb der übergeordneten Kategroei eingerückt sein.

    Ich weiß aber leider im Moment nicht, wie ich das scriptmäßig realisieren kann. Kann mir jemand einen Tipp geben, wie ich das per Script am besten umsetzen kann?

    Danke, Chriss

  • #2
    dein datenmodell nennt sich "adjacency list model", das einrücken in einer baumdarstellung bezeichnet man als "indent". damit lassen sich bei google und in der fachliteratur sehr vieles finden.

    Kommentar


    • #3
      @penizillin: Ich habe gerade mal eine Runde gegoogelt, habe aber nix passendes gefunden.

      Kann man das nicht irgendwie über eine MySQL-Abfrage realisieren? Mir würde vielleicht auch ein Beispiel das in etwa so funktioniert weiterhelfen.

      Das wäre die beste Lösung, ansonsten muss ich das ganze einschränken und das ganze auf max. drei Unterkategorien begrenzen, dann regel ich das über drei separate Pulldowns.

      Am liebsten wäre mir aber eine Lösung mit einem Pulldown, weil ich denke, dass ich da nicht so eingeschrnänkt bin von der Anzahl der Unterkategorien.

      Kommentar


      • #4
        es gibt in jeder bibliothek bücher über sql und die übung, von der du sprichst, gehört zu den paradebeispielen.
        Code:
        SELECT * FROM tbl ORDER BY id, pid
        lies das in ein array ein und schick es durch eine rekursive funktion (ist zwar nicht unbedingt effizient gegenüber einer iterativen methode, aber recht einfach zu implementieren und schont die db im gegensatz zu einem rekursiven query-aufruf).

        Kommentar


        • #5
          Hallo,

          okay das mit der SQL-Abfrage hätte ich wahrscheinlich auch noch hinbekommen, habe allerdings bisher noch nicht mit Arrays und mit rekursiven Funktionen gearbeitet.

          Du würdest mir sehr weiterhelfen, wenn Du mir dabei auch noch helfen könntest. Bisher habe ich auch mit dem Befehl mysql_fetch_object gearbeitet. Nehme ich nun stattdessen mysql_fetch_array?

          Hier der Codeschnipsel, wie ich es bisher gemacht habe:

          PHP-Code:
          $sql mysql_query("SELECT * FROM kategorien ORDER BY id, pid;") or die(mysql_error());
          while (
          $row mysql_fetch_object($sql))
          {
             
          $id $row->id;
             
          $kategorie $row-kategorie;
             
          $beschreibung $row->beschreibung;
             
          $pid $row->pid;

             echo 
          '<select name="kategorie">';
             echo 
          '<option value="'.$id.'">'.$kategorie.'</option>';
             echo 
          '</select>';

          Wie müsste ich den Codeschnipsel nun anpassen, dass ich als Endergebnis, wie angesprochen, Ein Pulldown-Feld bekomme, wo ich eine Alphabetisch geordnete Liste der Kategorien erhalten, in der die Unterkategorien unterhalb der Oberkategorie eingerückt sind und nach Auswahl das Feld mit die ID zurückgibt?

          Ich wäre dir sehr dankbar, wenn Du mir das umbasteln würdest oder es mir wenigstens erklären könntest, wie's richtig funktioniert. Ich bin halt noch blutiger PHP-Anfänger und komme trotz zwei Handbüchern und Onlinehilfen einfach nicht klar damit.

          Danke, Chriss

          Kommentar


          • #6
            ich bastel dir nichts um, erkläre aber gern, wie es funktionieren könnte.

            ja, mysql_fetch_array() ist schon mal gut (wenn auch nicht zwingend erforderlich, denn man kann auch ein array von objekten machen).

            über den begriff rekursion lernst du in der fachliteratur (beliebiges buch über grundzüge der programmierung) bei google und bei wikipedia.

            nach dem auslesen der daten aus der db könnten sie in dieser form vorliegen:
            Code:
            Array(
            0 => Array(id=>1, pid=>0, name=>wasauchimmer..., inhalt=>...)
            1 => Array(id=>2, pid=>0)
            2 => Array(id=>3, pid=>1)
            3 => Array(id=>4, pid=>1)
            4 => Array(id=>5, pid=>2)
            ...
            )
            so in etwa liegen die ja auch in der db, nehme ich an.

            die rekursion besteht nun darin, dass jeder aufruf die elemente einer "tiefe" ausgibt und die elemente dazu veranlasst, ihre kinder auszugeben:
            Code:
            void output(array baum, int pid, int tiefe)
            {
               für jeden knoten aus dem baum mit pid wiederhole
               {
                  print "tiefe"-mal leereichen zum einrücken
                  print knoten_name
                  output(baum, knoten_id, tiefe+1)
               }
            }
            und der initial-aufruf:
            Code:
            output(baum, 0, 0)
            das ist sehr grob, aber zumindest die idee sollte klar sein.

            Kommentar


            • #7
              Hi nochmal,

              ich bekomms einfach nicht hin. Habe es erst einmal nur mit foreach probiert, aber des macht ja keinen Sinn. Würdest Du evtl. noch ein wenig mehr Hilfestellung geben?

              Hier der vermurxte Codeschnipsel:

              PHP-Code:
              $sql "SELECT * FROM kategorien ORDER BY id, pid;";
              $result mysql_query($sql) or die(mysql_error());
              while (
              $row mysql_fetch_array($resultMYSQL_ASSOC))
              {
                 
              void output(array rowint valueint tiefe)
                 {
                    foreach (
              $row as $value)
                    {
                       print 
              "   ";
                       print 
              $value;
                       
              output ($row$value$tiefe+1);
                    }
                 }

              Bitte sei doch so nett und lös mir das Problem auf. Ich verspreche auch, dass ich mir das dann einpräge.

              Danke, Chriss

              Kommentar


              • #8
                beachte, dass mein pseudo-code keine php-vorlage ist und syntaktisch völlig falsch ist.

                output() ist eine funktion. wie man diese deklariert, findet man im manual: http://de2.php.net/manual/en/language.functions.php

                foreach ist nicht falsch, reicht aber nich aus, weil ich nicht nur _jeden_ knoten ansprechen möchte, sondern _jeden mit einer bestimmten eigenschaft_.

                außerdem sind das zwei voneinander (fast) unabhängige blöcke: erst alles aus der db in ein array lesen (in der while-schleife), dann die ausgabe (aufruf von output()).

                Kommentar


                • #9
                  Ich bin am verzweifeln. Wie fülle ich denn das Array richtig? Habe mir die Syntax bei de.php.net von array() und array_fill() angeschaut, aber ich raffe nicht, wie es damit geht.

                  Ich stelle mir vor, dass ich dann ein Array brauche, das in etwa so ausschaut.

                  [id][pid][kategorie]

                  Das im Endeffekt so ausgegeben wird.

                  [1][0][STAMM]
                  [2][1][Handbücher]
                  [3][1][Demo-Versionen]
                  [4][3][GDATA]
                  [5][3][Microsoft]
                  [6][2][PDF]

                  Ich kriegs einfach nicht hin.

                  Kommentar


                  • #10
                    z.b. so:
                    PHP-Code:
                    $arr = array(
                    => array('id' => 1'pid'=>0'name' => 'foobar'), 
                    => array('id' => 2'pid'=>0), 
                    => array('id' => 3'pid'=>1)

                    mit print_r($arr) kann man auch wieder reinschauen.

                    das füllen kann man auch anders machen:
                    PHP-Code:
                    $arr = array();
                    $arr[0] = array();
                    $arr[0]['id'] = 1;
                    $arr[0]['pid'] = 0;
                    $arr[0]['name'] = 'foobar';

                    $arr[1] = array();
                    $arr[1]['id'] = 2;
                    # etc. 

                    Kommentar


                    • #11
                      Okay, danke. Das Array habe ich jetzt. Hier der aktuelle Codeschnipsel:

                      PHP-Code:
                      $arr_count 0;
                      $cat_arr = array();
                          
                      $sql "SELECT * FROM kategorien ORDER BY id, pid;";
                      $result mysql_query($sql) or die(mysql_error());
                      while (
                      $row mysql_fetch_array($resultMYSQL_ASSOC))
                      {
                          
                         
                      $id $row["id"];
                         
                      $pid $row["pid"];
                         
                      $kategorie $row["kategorie"];
                              
                         
                      $cat_arr[$arr_count] = array();
                         
                      $cat_arr[$arr_count]['id'] = $id;
                         
                      $cat_arr[$arr_count]['pid'] = $pid;
                         
                      $cat_arr[$arr_count]['kategorie'] = $kategorie;
                              
                         
                      $arr_count $arr_count 1;
                              
                      }
                          
                      print_r($cat_arr); 
                      Ausgabe:

                      Array ( [0] => Array ( [id] => 1 [pid] => 0 [kategorie] => STAMM ) [1] => Array ( [id] => 2 [pid] => 1 [kategorie] => Handbücher ) [2] => Array ( [id] => 3 [pid] => 1 [kategorie] => Demo-Versionen ) [3] => Array ( [id] => 4 [pid] => 3 [kategorie] => GDATA ) [4] => Array ( [id] => 5 [pid] => 3 [kategorie] => Microsoft ) [5] => Array ( [id] => 6 [pid] => 2 [kategorie] => PDF ) )

                      Wie muss denn jetzt die Funktion und das darin enthaltene foreach() aussehen?

                      Kommentar


                      • #12
                        super! schau dir jetzt das kapitel über funktionen aus dem manual an und lege ein grundgerüst an.

                        Kommentar


                        • #13
                          Ich nutze schon Funktionen, deswegen sollte das kein Problem sein, aber ich weiß nicht, wie ich den Code basteln muss und wie ich dafür das foreach mit dem Array nutzen soll.

                          PHP-Code:
                          $arr_count 0;
                          $cat_arr = array();
                              
                          $sql "SELECT * FROM kategorien ORDER BY id, pid;";
                          $result mysql_query($sql) or die(mysql_error());
                          while (
                          $row mysql_fetch_array($resultMYSQL_ASSOC))
                          {
                              
                             
                          $id $row["id"];
                             
                          $pid $row["pid"];
                             
                          $kategorie $row["kategorie"];
                                  
                             
                          $cat_arr[$arr_count] = array();
                             
                          $cat_arr[$arr_count]['id'] = $id;
                             
                          $cat_arr[$arr_count]['pid'] = $pid;
                             
                          $cat_arr[$arr_count]['kategorie'] = $kategorie;
                                  
                             
                          $arr_count $arr_count 1;
                                  
                          }

                          function 
                          output($cat_arr,$pid,$id,$kategorie)
                          {
                             foreach(
                          $cat_arr as $value)
                             {
                                print 
                          "   ";
                                print 
                          $value;
                             }

                          Kommentar


                          • #14
                            die parameter $id und $kategorie sind nicht nötig - das steht im array.
                            dafür aber $tiefe.

                            du musst nun mit einer if-abfrage innerhalb der schleife die eigenschaft abfragen, die du haben willst.

                            Kommentar


                            • #15
                              Ich steh völlig auf dem Schlauch, wie ich das umsetzen muss. Auch mit if-Schleifen habe ich schon gearbeitet. Ich frage mich aber, wie ich innerhalb der foreach-Schleife eine if-Schleife einbauen soll und was ich in der if-Schleife abtesten soll bzw. wie ich mit der if-Schleife erreiche, dass $pid == $id ist, denn die id's und pid's sind ja jetzt in dem array.

                              Bitte hilf mir ein kleines bisschen mehr.

                              Kommentar

                              Lädt...
                              X