Ankündigung

Einklappen
Keine Ankündigung bisher.

Bekomme rekursiv programmierung nicht hin!

Einklappen

Neue Werbung 2019

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

  • Bekomme rekursiv programmierung nicht hin!

    Hallo Forum ich bin seid heute neu hier!

    Ich habe ein Problem ich will ein Skript schreiben wo die Kategorien wie ein Baum in die Tabelle geschrieben werden. Dabei haben die absoluten Hauptkategorien die parent_id 0. Alle anderen die dazu kommen haben dan als parent_id die id der kategorie.

    id name parent_id
    1 tiere 0
    2 autos 0
    3 affen 1
    4 loewen 1
    5 ferarie 2
    6 porsche 2

    Und so weiter eben ausbaubar. Habe schon über nested sets gelesen aber das rappel ich nicht. Nun will ich das rekursiv machen aber bekomme es einfach nicht hin. Vieleicht kann mir jemand helfen!

    Hier mein Code
    PHP-Code:
    <?php 
    navimenu 
    (0); 

    function 
    navimenu($cat){ 
         
        
    $sqlbefehl ="Select id,name,parent_id,level where parent_id='".$cat."'"
        
    $ergebnis mysql_query($sqlbefehl)or die(mysql_error()); 
        
    $num mysql_num_rows($ergebnis); 

        
    // Rekursionsabruch, okay kann man auch if($!num) nehmen, weiß gerade net 
       // was num_rows alles wirklich zurückgeben kann 
        
    if($num<1){ 
          echo 
    $row['name']; 
        }else{ 
             while(
    $row mysql_fetch_array()) 
             {  
                 
    $tmp $row['name']."+".navimenu($row['id']); 
                  
    $tmp $tmp."|"
                   
            echo 
    $sqlbefehl
             } 
        } 

    ?>
    Das komische er bringt gleich zu Beginn diese Fehlermeldung!

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where parent_id='0'' at line 1

    Dake für eure Hilfe mfg der Litter
    Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
    http://www.lit-web.de


  • #2
    SELECT x,y,z FROM tabellenname WHERE i=2
    Du hast vergessen, die Tabelle anzugeben.
    Und für nested sets gibt es fertige Klassen, zum Beispiel PEAR :: Package :: DB_NestedSet2

    Kommentar


    • #3
      Ja das mit der Tabelle habe ich vergessen und schon behoben!

      Der Code schaut jetzt insgesamt anders aus aber nun geht gar nichts mehr ich sehe nur einen weisen Bildschirm!

      PHP-Code:
      <?php
      function navimenu($tab_baum,$cat){
       
          
      $sqlbefehl ="Select id,name,parent_id,level From $tab_baum where parent_id='".$cat."'";
          
      $ergebnis mysql_query($sqlbefehl)or die(mysql_error());
               while(
      $row mysql_fetch_array()){
          echo 
      $row['name']."<br>"
                   
      navimenu($cat.$row['id']);
        
      //echo $sqlbefehl;
               
      }
      }
      ?>
      HAbe mich schon belesen über nested sets und das rappel ich gar nicht. Darum will ich erst mal das rekursive verstehen und umsetzen
      Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
      http://www.lit-web.de

      Kommentar


      • #4
        Bitte nocheinmal versuchen mit
        PHP-Code:
        function navimenu($tab_baum,$cat) {
          
        $sqlbefehl ="Select id,name,parent_id,level From $tab_baum where parent_id='".$cat."'";
          
        $ergebnis mysql_query($sqlbefehl) or die(mysql_error());
          if (
        mysql_num_rows($ergebnis)==0) {
            echo 
        '-- kein Eregebnis für ' $sqlbefehl "<br />\n";
          }
          else {
            while(
        $row mysql_fetch_array()) {
              echo 
        ' ~ ' $row['name'] . "<br />\n";
              
        navimenu($cat.$row['id']);
            }
          }

        Kommentar


        • #5
          Leider immer noch das gleiche Ergebnis ein weiser Bildschirm ohne irgendwas!
          Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
          http://www.lit-web.de

          Kommentar


          • #6
            Dann hast Du an anderer Stelle einen parse error eingebaut oder die Funktion wird nicht aufgerufen.

            Kommentar


            • #7
              Woran kann das aber liegen das diese Funktion nicht aufgerufen wird? Das macht mich irre!
              Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
              http://www.lit-web.de

              Kommentar


              • #8
                Zitat von litterauspirna Beitrag anzeigen
                HAbe mich schon belesen über nested sets und das rappel ich gar nicht. Darum will ich erst mal das rekursive verstehen und umsetzen
                Rekursive Datenbankzugriffe sollte man aus performancegründen eigentlich vermeiden. Andereseits bei so wenig Daten, wie es ein Menu normalerweise beinhaltet, spielt das sicher keine Rolle.
                Was ich in deinem Beispiel nicht verstehe ist
                PHP-Code:
                navimenu($cat.$row['id']); 
                Ich denke, das müsste doch ein Komma sein, da die Funktion zwei Parameter erwartet.
                Hier einach mal ein Beispiel, wie ich es andernorts schon gebraucht habe:
                PHP-Code:
                function show_menu($pid$level){
                    
                $sql "SELECT
                                name,
                                id
                            FROM
                                tab2
                            WHERE
                                pid = 
                $pid";
                    
                $res mysql_query($sql) or die(mysql_error());
                    while (
                $obj mysql_fetch_object($res)){
                        echo 
                str_repeat('-'$level 4) . "$obj->name<br />";
                        
                show_menu($obj->id$level 1);
                    }
                }

                show_menu(00); 
                Gruss
                L

                Kommentar


                • #9
                  Vielen Dank aber auch mit diesem Code habe ich keinen Erfolg:

                  Habe da schon die Variablen auf global gesetzt aber funktioniert nicht!

                  Die Fehlermeldung kommt hier
                  You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE parent_id =' at line 7


                  PHP-Code:
                  <?php
                  function show_menu($pid$level){
                  global 
                  $pid;
                  global 
                  $level;
                      
                  $sql "SELECT
                      id,
                                  name,
                                  parent_id
                              FROM
                                  
                  $tab_baum
                              WHERE
                                  parent_id = 
                  $pid";
                      
                  $res mysql_query($sql) or die(mysql_error());
                      while (
                  $obj mysql_fetch_object($res)){
                          echo 
                  str_repeat('-'$level 4) . "$obj->name<br />";
                          
                  show_menu($obj->id$level 1);
                      }
                  }
                  show_menu(00); 
                  ?>
                  Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                  http://www.lit-web.de

                  Kommentar


                  • #10
                    PHP-Code:
                    $res mysql_query($sql) or die(mysql_error().'<pre>'.$sql.'</pre>'); 
                    Ich wette, es fehlt der Name der Tabelle, da $tab_baum in der Funktion nicht definiert ist.

                    Kommentar


                    • #11
                      Zitat von David Beitrag anzeigen
                      Ich wette, es fehlt der Name der Tabelle, da $tab_baum in der Funktion nicht definiert ist.
                      Das denke ich auch. Ich sehe normalerweise auch keine Grund Tabellennamen in Variable zu schreiben. Ausserdem macht es keinen Sinn, die parent_id abzufragen, die hast du ja schon in $pid.
                      Gruss
                      L

                      Kommentar


                      • #12
                        schau dir mal an wo du deinen Tabellennamen herbekommst

                        generell ist es eine gute Idee, beim "... or die () ..." $sql mit ausgeben zu lassen; dann siehst du auch wie Deine Variablen ausgewertet wurden. $tabbaum ist vermutlich leer; wieso ist das überhaupt variabel?

                        Wenn gar nichts kommt, siehe die Hinweise im Forum-Kopf oben zur allgemeinen Fehlersuch, E_ALL einschalten und so... dann siehst du auch die Fehlermeldungen vom Parsen, also wenn dein Programm gar nicht erst läuft und der Schirm weiss bleibt.

                        Kommentar


                        • #13
                          Momentan sieht es so aus.

                          Nun ist es so ich bekomme eine Fehlermeldung nur ganz kurz und dann bekomme ich die Meldung das der Vorgang unterbrochen wurde.

                          Ich tue mich bei dem rekursiven Zeugs so schwer

                          PHP-Code:
                          <?php
                          session_start
                          ();
                          error_reporting(E_ALL);
                          $sqlhost="localhost";
                          $sqluser="root";
                          $sqlpw="";
                          $sqldb="test";
                          $sqlbefehl=mysql_connect($sqlhost,$sqluser,$sqlpw)or die (mysql_error());
                          mysql_select_db($sqldb,$sqlbefehl)or die (mysql_error());
                          $tab_baum $pref."baum";
                          //$tab_inhalte = $pref."inhalte";

                          function show_menu($tab_baum,$pid$level){
                          global 
                          $tab_baum;
                          global 
                          $pid;
                          global 
                          $level;
                              
                          $sql "SELECT
                              id,
                                          name,
                                          parent_id
                                      FROM
                                          
                          $tab_baum
                                      WHERE
                                          parent_id = '"
                          .$pid."'";
                              
                          $res mysql_query($sql) or die(mysql_error());
                              while (
                          $obj mysql_fetch_object($res)){
                                  echo 
                          str_repeat('-'$level 4) . "$obj->name<br />";
                                  
                          show_menu($obj->id$level 1);
                              }
                          }
                          show_menu(00); 
                           
                          ?>
                          Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                          http://www.lit-web.de

                          Kommentar


                          • #14
                            function show_menu($tab_baum,$pid, $level){
                            global $tab_baum;
                            Du übergibst einen Parameter $tab_baum und hast zusätzlich noch
                            global $tab_baum? Genauso $pid und $level. Das schreit nach Problemen.
                            Und dann rufst Du
                            show_menu(0, 0);
                            auf. Da fehlt doch der erste Parameter. Und das sagt Dir PHP auch mit error_reporting(E_ALL).


                            PHP-Code:
                            <?php
                            error_reporting
                            (E_ALL);
                            ini_set('display_errors'1);
                            ini_set('mysql.trace_mode'1);
                            session_start();

                            function 
                            get_mysql() {
                              static 
                            $mysql=null;
                              if (
                            is_null($mysql)) {
                                
                            $sqlhost="localhost";
                                
                            $sqluser="root";
                                
                            $sqlpw="";
                                
                            $sqldb="test";
                                
                            $mysql=mysql_connect($sqlhost,$sqluser,$sqlpw)or die (mysql_error());
                                
                            mysql_select_db($sqldb$mysql)or die (mysql_error());
                              }
                            }

                            function 
                            get_config() {
                              static 
                            $conf null;
                              if(
                            is_null($conf)) {
                                
                            $con = array();
                                
                            $con['table_prefix'] = 'tbl_';
                                
                            $con['table_menutree'] = $con['table_prefix'] . 'baum';
                              }
                              return 
                            $conf;
                            }

                            function 
                            show_menu($pid$level) {
                              
                            $confg get_config();
                              
                            $sql "
                                SELECT
                                  id,name
                                FROM
                                  "
                            .$con['table_menutree']."
                                WHERE
                                  parent_id = "
                            .(int)$pid;
                              
                            $res mysql_query($sqlget_mysql()) or die(mysql_error());
                              echo 
                            str_repeat('-'$level 4) . '[' mysql_num_rows($res) . "]<br />\n";
                              while (
                            $row mysql_fetch_array($resMYSQL_ASSOC)) {
                                echo 
                            str_repeat('-'$level 4) . htmlentities($row['name']) . "<br />\n";
                                
                            show_menu($row['id'], $level 1);
                              }
                            }

                            echo 
                            '<p>Menu Anfang</p>';
                            show_menu(00); 
                            echo 
                            '<p>Menu Ende</p>';
                            ?>

                            Kommentar


                            • #15
                              Mehr als vorkauen kann ich es dir auch nicht. Und wenn du es nicht schaffst, ein funktionierendes Script durch das alleinige Anpassen von Attribut- und Tabellennamen (es gibt wirklich keinen Grund letzteren in eine Variable zuschreiben, aber das habe ich dir auch schon öfters gesagt) an deine Umgebung anzupassen, dann weiss ich auch nicht, wer dir noch helfen soll.
                              Gruss
                              L

                              Kommentar

                              Lädt...
                              X