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:
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
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($file, true);
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"));
?>
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
Kommentar