php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 10-04-2012, 15:27
alxy
 Registrierter Benutzer
Links : Onlinestatus : alxy ist offline
Registriert seit: Apr 2012
Beiträge: 6
alxy befindet sich auf einem aufstrebenden Ast
Standard 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
Mit Zitat antworten
  #2 (permalink)  
Alt 10-04-2012, 15:30
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.724
Kropff befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #3 (permalink)  
Alt 10-04-2012, 15:31
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.604
h3ll befindet sich auf einem aufstrebenden Ast
Standard

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?
Mit Zitat antworten
  #4 (permalink)  
Alt 10-04-2012, 15:32
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.724
Kropff befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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
Mit Zitat antworten
  #5 (permalink)  
Alt 10-04-2012, 15:36
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.604
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Warum nicht den DirectoryIterator verwenden statt mit opendir() herumhampeln? Damit ließe sich sowas so schön und übersichtlich lösen.
Mit Zitat antworten
  #6 (permalink)  
Alt 10-04-2012, 15:37
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.724
Kropff befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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
Mit Zitat antworten
  #7 (permalink)  
Alt 10-04-2012, 15:40
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.604
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
  #8 (permalink)  
Alt 10-04-2012, 15:42
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.724
Kropff befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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
Mit Zitat antworten
  #9 (permalink)  
Alt 10-04-2012, 15:43
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.604
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
  #10 (permalink)  
Alt 10-04-2012, 15:44
alxy
 Registrierter Benutzer
Links : Onlinestatus : alxy ist offline
Registriert seit: Apr 2012
Beiträge: 6
alxy befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #11 (permalink)  
Alt 10-04-2012, 15:47
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.604
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
  #12 (permalink)  
Alt 10-04-2012, 15:53
alxy
 Registrierter Benutzer
Links : Onlinestatus : alxy ist offline
Registriert seit: Apr 2012
Beiträge: 6
alxy befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #13 (permalink)  
Alt 10-04-2012, 15:55
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.604
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
  #14 (permalink)  
Alt 10-04-2012, 15:58
alxy
 Registrierter Benutzer
Links : Onlinestatus : alxy ist offline
Registriert seit: Apr 2012
Beiträge: 6
alxy befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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:
Zitat:
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
Mit Zitat antworten
  #15 (permalink)  
Alt 10-04-2012, 16:01
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.604
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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:
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:
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.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Rekursive Verzeichnisauflistung - OOP PHP Einsteigertutorial 1 Peter Kropff einermeiner PHP Developer Forum 2 20-07-2011 14:19
Suche ein Tutorial ähnlich dem von Peter Kropff aber auf englisch wurzelchensen Off-Topic Diskussionen 10 11-03-2008 21:52
Code funktioniert nicht (vom genialen Peter Kropff Tutorial) wurzelchensen PHP Developer Forum 7 15-01-2008 16:14
Erweiterung für Tutorial "Login mit Hilfe von PHP und mySQL" ChristiaNN PHP Developer Forum 0 05-12-2006 18:00
SUCH Community Tutorial mukraker Apps und PHP Script Gesuche 1 20-01-2003 19:23

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni


 

Aktuelle PHP Scripte

Formmailer v1.6.1 Bootstrap 4

Formmailer v1.6.1 Bootstrap wurde extra für Bootstrap entwickelt. Mit Bootstrap kann man schnell und einfach kleine oder große Projekte entwickeln, die auf Geräten in allen erdenklichen Formen funktionieren.

18.12.2018 arne-home | Kategorie: PHP/ Formular
HeidiSQL - kostenloses MySQL front-end Editor für Windows ansehen HeidiSQL - kostenloses MySQL front-end Editor für Windows

HeidiSQL - ist ein Windows-Editor für die bekannt open Source Datenbank mySQL

10.12.2018 Berni | Kategorie: MYSQL/ Management
piwik Open-Source Webanalyse-Software ansehen piwik Open-Source Webanalyse-Software

piwik ist eine gute Alternative zu Google Analytics. Viele Features und ein modernes Erscheinungsbild mit aussagefähigen Statistiken in Echtzeit

10.12.2018 phpler | Kategorie: PHP/ Besucherzaehler
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:09 Uhr.