PHP Such-Klasse (Erweiterung Tutorial Kropff

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

  • PHP Such-Klasse (Erweiterung Tutorial Kropff

    Hallo,

    ich habe mich jetzt auch mal an die OOP herangewagt und wollte eine Suchklasse bauen. Dafür habe ich erstmal die klasse aus Peter Kropffs Einführungstutorial missbraucht.
    Allerdings funktinoiert die nicht so ganz:
    PHP-Code:
    <?php
      error_reporting 
    (E_ALL E_NOTICE);
      class 
    Dir
      
    {
        private 
    $root;
        private 
    $filetype         = array ();
        private 
    $deny            = array ();
        private 
    $searchvalues     = array ();
        private 
    $searchresults  = array ();

        
    // Festlegen des Startverzeichnisses
        
    public function setRoot ($var)
        {
          
    $this -> root $var;
        }

        
    // Festlegen der verbotenenen Ordner
        
    public function denyFolder ($var)
        {
          
    $this -> deny $var;
        }

        
    // Festlegen der erlaubten Dateitypen
        
    public function setFiletype ($var)
        {
          
    $this -> filetype $var;
        }
        
        
    // Festlegen der Suchwörter
        
    public function setSearchvalues ($var)
        {
            
    $this -> searchvalues $var;
        }

        
    // Suche starten, gibt im Erfolgsfall $searchresults als Array zurück
        
    public function startSearch ()
        {
          
    $this -> doNavigate();
          if (
    $this -> searchresults)
          {
            return 
    $this -> searchresults;
          }
          else
          {
            return 
    false;
          }
        }

        
    // rekursive Methode zum Durchlaufen aller Ordner und Dateien
        
    private function doNavigate ()
        {
          
    // "temporäres" Array zum späteren sortieren
          
    $sort = array ();
          
    // aktuelles Verzeichnis wird geöffnet, wenn Verzeichnis vorhanden
          // und Leserechte vorhanden sind
          
    if ($handle opendir ($this -> root))
          {
            
    // Ordern und Dateien im "temopäres" Array $sort einlesen
            
    while ($found readdir ($handle))
            {
              if (
    $found != '.' && $found != '..')
              {
                
    $sort[] = $this -> root.'/'.$found;
              }
            }
            
    // Überprüfung auf Inhalte
            
    if (sizeof ($sort) > 0)
            {
              
    // alphabetisch sortieren
              
    natcasesort($sort);
              
    // Array in Schleife durchlaufen
              
    foreach ($sort as $var)
              {
                
    // Wenn Ordner
                
    if (is_dir ($var))
                {
                  
    // Prüfen auf erluabten Ordner
                  
    if (!$this -> checkFolder($var)) 
                  {
                    
    // aktuelles Verzeichnis festlegen
                    
    $this -> setFolder ($var);
                    
    // Rekursion, Methode ruft sich selber noch einmal auf
                    
    $this -> doNavigate();
                  }
                }
                
    // Wenn Datei
                
    else if (is_file($var))
                {
                  
    // Methode zum Suchen aufrufen
                  
    $this -> doSearch ($var);
                }
              }
            }
            
    // Verzeichnis schließen
            
    closedir($handle);
          }
        }

        
    // Methode, um aktuelles Verzeichnis anzupassen
        
    private function setFolder ($folder)
        {
          
    $this -> root $folder;
        }

        
    // Methode zur Überprüfung der erlaubten Ordner
        
    private function checkFolder ($folder)
        {
          
    //Schleife zur Überprüfung aller verbotenen Ordner
          
    foreach ($this -> deny as $forbidden)
          {
            
    // Pfad in Einzelordner zerlegen
            
    $tmp explode ('/'$folder);
            
    // Überprüfung des letzten Ordners
            
    if ($tmp[count($tmp) -1] == $forbidden)
            {
             
    // wenn verboten, true zurückgeben und abbrechen
              
    return true;
            }
          }
        }

        
    // Methode zur Erfassung der gewünschten Inhalte
        
    public function doSearch ($file)
        {
          
    // Datei wird auf korrekten Typ hin überprüft
          
    if ($this -> checkFiletype($file))
          {
            
    $parsedfile strtolower($this -> parseFile($file));
            
    $searchvalues $this -> searchvalues;
            
            
    // Schleife zum Durchsuchen der Datei nach Suchwörtern
            
    foreach ($searchvalues as $value)
            {
                
    $value strtolower($value);
                
    $result $this -> strpos_recursive($parsedfile$value);
                
                if (
    count($result) > 0)
                {
                    
    $searchresults[$file] = $result;
                }
            }
          }
        }
        
        
    // Methode zum Parsen der Datei
        
    public function parseFile ($file)
        {
            
    $content file_get_contents($filetrue);
            return eval(
    '?>' $content '<?');
        }
        
        
    // Methode zum rekursiven Suchen
        
    private function strpos_recursive($haystack$needle$offset 0, &$results = array())
        {               
            
    $offset strpos($haystack$needle$offset);
            if(
    $offset === false) {
                return 
    $results;           
            } 
            else {
            
    $results[] = $offset;
            return 
    strpos_recursive($haystack$needle, ($offset 1), $results);
            }
        }

        
    // Methode zur Überprüfung der gewünschten Dateitypen
        
    private function checkFiletype ($file)
        {
          
    //Schleife zur Überprüfung aller erlaubten Dateien
          
    foreach ($this -> filetype as $valid)
          {
            
    // wenn Dateiendung paßt, true zurückgeben und abbrechen
            
    $tmp explode ('.'$file);
            
    $end $tmp[1];
            
            if (
    $end == $valid)
            {
              return 
    true;
            }
          }
        }
      }

      
    // Definition aller benötigten Parameter
      
    $filetype = array ('.html','.php');
      
    $folder   = array ('allgemeines');
      
    $search   = array ('JA''NEIN');
      
    $root     $_SERVER['DOCUMENT_ROOT'].'/umfrage';

      
    // Objekt vom Typ $dir erzeugen
      
    $dir = new Dir;
      
    // Startverzeichnis festlegen
      
    $dir -> setRoot ($root);
      
    // Erlaubte Ordner festlegen
      
    $dir -> denyFolder ($folder);
      
    // Erlaubte Dateitypen fetslegen
      
    $dir -> setFiletype ($filetype);
      
    // Suchwörter festlegen
      
    $dir -> setSearchvalues ($search);
      
    // Suche beginnen
      //$result = $dir -> startSearch();
      // Ergebnis ausgeben
      //var_dump($result);
      
    var_dump($dir -> doSearch($root."/index.php"));
    ?>
    Eigentlich sind alle functions unter startSearch private, nur zu testzwecken jetzt public.
    Problem ist das var_dump($dir -> doSearch($root."/index.php")); immer NULL ausgibt, obwohl es die datei selbstverständlich gibt und auch ein manuelles eval(); erzeugt den entsprechenden HTML-Quellcode.
    Sieht da jemand einen offensichtlichen fehler?
    Oder wie kann ich hier am besten an Fehler herangehen? Beim prozeduralen wars einfacher, da konnte man einfach ausprobieren und mit var_dump fast alles finden. Hier leider nichtmehr

    Und zum Schluss noch was: Ja, ich habe das noch in EINEM (!) anderen Forum gepostet. Da mir dort aber anscheinend niemand helfen konnte und ich das nun doch wirklich schaffen möchte mit der klasse, nun hier.

    alxy

  • #2
    Schau dir mal das zweite Tutorial an. Da gibt es eine Fehlerbehandlung, die dir sicher weiter hilft.

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      eval() ist böse und sollte nicht verwendet werden.

      Das Ganze sieht für mich sehr merkwürdig und unnötig komplex aus. Wenn du einfach nur Dateien in einem Verzeichnis durchsuchen möchtest, reicht ein einfacher 5-Zeiler mit einer foreach-Schleife.

      Wozu willst du eigentlich PHP-Dateien durchsuchen?

      Kommentar


      • #4
        Zitat von h3ll Beitrag anzeigen
        Das Ganze sieht für mich sehr merkwürdig und unnötig komplex aus.
        Das ist wegen diverser Filtermechanismen.

        Peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          Warum nicht den DirectoryIterator verwenden statt mit opendir() herumhampeln? Damit ließe sich sowas so schön und übersichtlich lösen.

          Kommentar


          • #6
            Zitat von h3ll Beitrag anzeigen
            Warum nicht den DirectoryIterator verwenden statt mit opendir() herumhampeln? Damie ließe sich sowas so schön und übersichtlich lösen.
            Das Tutorial ist nur ein Einstieg in die Materie. Mehr nicht.

            Peter
            Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
            Meine Seite

            Kommentar


            • #7
              Zitat von Kropff Beitrag anzeigen
              Das Tutorial ist nur ein Einstieg in die Materie. Mehr nicht.
              Wie auch immer. Eine Parse-Funktion, wie sie hier im Thread zu sehen ist, hat in einer Directory-Klasse jedenfalls überhaupt nichts verloren. Und eval() gehört sowieso raus.

              Kommentar


              • #8
                Zitat von h3ll Beitrag anzeigen
                Wie auch immer. Eine Parse-Funktion, wie sie hier im Thread zu sehen ist, hat in einer Directory-Klasse jedenfalls überhaupt nichts verloren. Und eval() gehört sowieso raus.
                Das ist auch nicht von mir.

                Peter
                Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                Meine Seite

                Kommentar


                • #9
                  Zitat von Kropff Beitrag anzeigen
                  Das ist auch nicht von mir.
                  Hätte mich auch schwer geschockt, wenn das der Fall gewesen wäre Also ich hab schon vermutet, dass das nicht von dir stammt.

                  Kommentar


                  • #10
                    Mh,

                    aber es müsste doch theoretisch auch so gehen.
                    Zu dem eval: ich hatte da schon eine schöne klasse gefunden, die PHP und HTML für eine suche trennen kann, allerdings hat das nicht funktioniert und zu Testzwecken habe ich das erstmal soweit reduziert.
                    Zu dem Iterator: ich fange grade erst an. Man kann alles schöner lösen, oder noch schöner, oder noch schöner, aber nie perfekt :P
                    Wenn ich im Umagang mit Klassen und Objekt sicher bin, ist das sicher ein cooles Instrument (so wie ich das beim drüberlesen so gesehen habe), aber jetzt trau ich mir das noch nicht zu

                    alxy

                    Kommentar


                    • #11
                      Zitat von alxy Beitrag anzeigen
                      Zu dem eval: ich hatte da schon eine schöne klasse gefunden, die PHP und HTML für eine suche trennen kann, allerdings hat das nicht funktioniert und zu Testzwecken habe ich das erstmal soweit reduziert.
                      Was gibts da zu trennen? Und welchen Sinn hat es überhaupt PHP-Dateien zu durchsuchen?

                      Ich glaube, du bist auf dem komplett falschen Dampfer. Wenn du den Inhalt einer Webseite durchsuchen möchtest, dann geht es sicher nicht, indem du einfach PHP-Dateien "durchsuchst". Du müsstest deinen Seiteninhalt indexieren und diesen Index kannst du dann durchsuchen. Üblicherweise ist der Seiteninhalt in einer Datenbank gespeichert und man kann die Suche der Datenbank überlassen.

                      Kommentar


                      • #12
                        Na, bei meinen laienhaft zusammengeschusterten Seiten ist das nicht der Fall.
                        Da ist PHP und HTML bunt gemischt, mittlerweile auch manchmal getrennt. (Aber bei nem Kontaktformular zB lasse ich den Code gerne einfach auf der Seite)
                        Natürlich darf der PHP Code nicht ausgelesen werden, deshalb das eval. Damit habe ich mir den reinen Ausgabecode erhofft.
                        Wenn das funktionieren würde, könnte ich die suche dann noch auf alles zwischen <body> und </body> beschränken. Und HTML-Code escapen, und, und, und...
                        Aber dafür muss das ganze natürlich erstmal funktionieren.
                        Zu den Tutorials: Habe ich alle durchgelesen inklusive der Theorie! (Auch wenns am Ende trotz der "göttlichen" Zitate langweilig wurde ...)

                        alxy

                        Kommentar


                        • #13
                          Zitat von alxy Beitrag anzeigen
                          Na, bei meinen laienhaft zusammengeschusterten Seiten ist das nicht der Fall.
                          Da ist PHP und HTML bunt gemischt, mittlerweile auch manchmal getrennt. (Aber bei nem Kontaktformular zB lasse ich den Code gerne einfach auf der Seite)
                          Natürlich darf der PHP Code nicht ausgelesen werden, deshalb das eval. Damit habe ich mir den reinen Ausgabecode erhofft.
                          Wenn das funktionieren würde, könnte ich die suche dann noch auf alles zwischen <body> und </body> beschränken. Und HTML-Code escapen, und, und, und...
                          Aber dafür muss das ganze natürlich erstmal funktionieren.
                          Ändert nichts an meiner Aussage, dass du deine Seite indexieren musst um sie vernünftig durchsuchen zu können. Aber du könntest auch einfach Google für die Suche verwenden. Google hat sich schließlich darauf spezialisiert und würde dir all die Arbeit abnehmen.

                          Kommentar


                          • #14
                            Zitat von h3ll Beitrag anzeigen
                            Ändert nichts an meiner Aussage, dass du deine Seite indexieren musst um sie vernünftig durchsuchen zu können. Aber du könntest auch einfach Google für die Suche verwenden. Google hat sich schließlich darauf spezialisiert und würde dir all die Arbeit abnehmen.
                            Ich zitiere mich selbst:
                            Man kann alles schöner lösen, oder noch schöner, oder noch schöner
                            Mir ist klar, dass es die benutzerdefineirte Suche sowie tausend andere fertige Suchscripte gibt, die man leicht durch Google findet.
                            Aber ich habe mir das nun eben als fiktive Aufgabe zum Üben ausgesucht. Produktives Suchen wird damit wahrscheinlich nicht möglich sein, aber mir gehts ums Prinzip.
                            Ich will keine verünftige suche haben, sondern die OOP verstehen

                            alxy

                            Kommentar


                            • #15
                              Zitat von alxy Beitrag anzeigen
                              Aber ich habe mir das nun eben als fiktive Aufgabe zum Üben ausgesucht.
                              Dann solltest du es richtig üben, ansonsten ist die Übung sinnlos, bzw. schadet dir sogar, wenn du was falsches lernst.

                              Zitat von alxy Beitrag anzeigen
                              aber mir gehts ums Prinzip.
                              Mir auch.

                              Prinzipielle Lösung: Seiteninhalt vernünftig indexieren
                              Praktische Lösung: Google verwenden

                              Zitat von alxy Beitrag anzeigen
                              Ich will keine verünftige suche haben, sondern die OOP verstehen
                              Dann such dir eine sinnvollere Aufgabe um OOP zu lernen.

                              Eine nette Übung (nicht weit weg von deiner) wäre doch einen schönen Verzeichnisbaum auszugeben. Und dies kannst du dann Schritt für Schritt verfeinern und erweitern.

                              Kommentar

                              Lädt...
                              X