phpbar.de logo

Mailinglisten-Archive

[php] [1/2 MySQL] performanteste Loesung gesucht

[php] [1/2 MySQL] performanteste Loesung gesucht

Oliver Richter Hypergrip at gmx.de
Mon Sep 18 14:31:48 CEST 2006


Hallo Liste,

Auf einem Server habe ich eine Reihe von Ordnern und Unterordnern. Benutzer können über einen einfachen Verzeichnisbaum navigieren, allerdings sollen bestimmte Ordner nur für Benutzer mit entsprechendem Userlevel sichtbar sein. Zu jedem Ordner auf der Festplatte gibt es in einer MySQL-Datenbank einen Eintrag in der Tabelle "verzeichnisse" mit den Feldern "Pfad", "Datei" und "Level" (und natürlich einem Index "id"). Das sieht dann z.B. so aus:

id - pfad - datei - level
1 - (leer) - Ordner01/ - 1
2 - Ordner01/ - unterordner_A/ - 1
3 - Ordner01/unterordner_A/ - Testordner_01/ - 3
4 - (leer) - Ordner02/ - 2
usw...

Ich habe jetzt eine einfache Funktion geschrieben, welche rekursiv die Verzeichnisse auf der Festplatte durchgeht und so einen Baum ausgibt.

function verzeichnisbaum($verzeichnis_pointer)
{
	global $verzeichnis_ebene;
	global $n;
	if ($handle = opendir($verzeichnis_pointer)) 
	{
		//Anfang While - solange wie das Dateihandle noch Daten liefert
		while (false !== ($file = readdir($handle))) 
		{				
			//Die "Navigations-Ordner" (. und ..) außen vor lassen
			if ($file == "." || $file == "..")
			{
				continue;
			}

			//Falls der Verzeichnis_Pointer nicht mit einem Slash aufhört, muss es angehängt werden
			if(substr($verzeichnis_pointer, -1, 1)!='/')
			{
				$verzeichnis_pointer = $verzeichnis_pointer . "/";
			}

			$filetypetest = filetype($verzeichnis_pointer.$file);
			if ($filetypetest == "dir") 
			{		
				$verzeichnis_ebene++;
				$i = 0;
				while ($i < $verzeichnis_ebene)
				{
					echo "<img src=\"../images/icon_menu_spacer.gif\">";
					$i++;
				}
				//Link zum Zielordner erzeugen
				$target_dir = $verzeichnis_pointer . $file . "/";
				//Link fürs Listing erzeugen
				$target_dir2 = str_replace("./", "", $target_dir);
				$target_dir_listing = $phpself . "?dir=" . rawurlencode($target_dir2);
				echo "<a href=\"$target_dir_listing\"><img src=\"../images/icon_menu_ordner.gif\">$file</a><br>";
				//Rekursion
				verzeichnisbaum($target_dir);
			}
		//Ende While	
		}
		//Ende des Einlesens
		closedir($handle);
		$verzeichnis_ebene--;
		return 1;
	}
	else
	{
		return 0;
	}
}

Jetzt suche ich nach der peformantesten Möglichkeit, bei der Ausgabe des Baumes die Zugangslevel zu berücksichtigen und Ordner ggf. nicht auszugeben. In jedem Durchlauf der Rekursion eine neue Select-Abfrage abzusetzen stelle ich mir sehr unperformant vor, hab aber grade eine Denkblockade und mir will keine saubere, effektive Lösung einfallen :/

Tipps/Vorschläge/Lösungsansätze/Code willkommen!
Danke im Voraus

/Oliver





-- 
"Feel free" - 10 GB Mailbox, 100 FreeSMS/Monat ...
Jetzt GMX TopMail testen: http://www.gmx.net/de/go/topmail

-- 
"Feel free" - 10 GB Mailbox, 100 FreeSMS/Monat ...
Jetzt GMX TopMail testen: http://www.gmx.net/de/go/topmail

php::bar PHP Wiki   -   Listenarchive