Ich arbeite den Online Auftritt von Peter Kropff durch, um PHP und MySQL zu lernen.
Nun bin ich hier:
Tutorials - Objektorientierte Programmierung mit PHP5 - Einstiegstutorial 1 - Überlegungen
Habe das Skript angefertigt wie im Tutorial und zur Sicherheit auch noch die Lösung heruntergeladen.
Wenn ich allerdings den "ersten Ordner im Dateisystem" ausschließen will (also der, der bei alphabetischer Sortierung im Betriebssystem als erstes angezeigt wird), dann hängt sich das Skript immer auf, ich habe zwar eine Lösung gefunden, verstehe allerdings nicht, warum der Fehler nur dann auftritt, wenn ich den ersten Ordner ausschließe, bei allen anderen funktioniert es.
Quelle:
http://peterkropff.de/misc/docs/PHP_..._1_Loesung.zip
Nun bin ich hier:
Tutorials - Objektorientierte Programmierung mit PHP5 - Einstiegstutorial 1 - Überlegungen
Habe das Skript angefertigt wie im Tutorial und zur Sicherheit auch noch die Lösung heruntergeladen.
Wenn ich allerdings den "ersten Ordner im Dateisystem" ausschließen will (also der, der bei alphabetischer Sortierung im Betriebssystem als erstes angezeigt wird), dann hängt sich das Skript immer auf, ich habe zwar eine Lösung gefunden, verstehe allerdings nicht, warum der Fehler nur dann auftritt, wenn ich den ersten Ordner ausschließe, bei allen anderen funktioniert es.
PHP-Code:
<?php
error_reporting (E_ALL | E_NOTICE);
class Dir
{
private $root;
private $filetype = array ();
private $deny = array ();
private $files = 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;
}
// Suche starten, gibt im Erfolgsfall $files als Array zurück
public function startSearch ()
{
$this -> doNavigate();
if ($this -> files)
{
return $this -> files;
}
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))
{
// aktuelles Verzeichnis festlegen
$this -> setFolder ($var); // wenn der Ordner im deny Array steht, dann wird
// setFolder nicht ausgeführt und doNavigate mit demselben Ordner wieder aufgerufen
// Rekursion, Methode ruft sich selber noch einmal auf
$this -> doNavigate();
}
// Wenn Datei
else if (is_file($var))
{
// Methode zum Schreiben der Informationen aufrufen
$this -> setFile ($var);
}
}
}
// Verzeichnis schließen
closedir($handle);
}
}
// Methode, um aktuelles Verzeichnis anzupassen
private function setFolder ($folder)
{
// wenn Ordner erlaubt
if (!$this -> checkFolder($folder))
{
// aktuelles Verzeichnis setzen
$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
private function setFile ($file)
{
// Datei wird auf korrekten Typ hin überprüft
if ($this -> checkFiletype($file))
{
// Dateigröße
$filesize = filesize ($file);
// letze Änderung
$filetime = filemtime ($file);
// Position des letzen "/"
$mark = strrpos ($file, "/");
// Pfad ohne Datei
$path = substr ($file, 0, $mark);
// Dateinamen ohne Pfadangabe
$file = substr ($file, $mark + 1);
// Infos in $files schreiben
$this -> files[] = array (
'path' => $path,
'file' => $file,
'size' => $filesize,
'time' => $filetime
);
}
}
// 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
if (substr ($file, -4) == $valid)
{
return true;
}
}
}
}
// Definition aller benötigten Parameter
$filetype = array ('.php','.png');
$folder = array ('bilder');
$root = $_SERVER['DOCUMENT_ROOT'].'np/kurs';
// 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);
// Suche beginnen
$result = $dir -> startSearch();
// Ergebnis ausgeben
echo '<pre>';
print_r($result);
?>
http://peterkropff.de/misc/docs/PHP_..._1_Loesung.zip
Kommentar