mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Fr 29.03.2024 15:46 Benutzername: Passwort: Auto-Login

Thema: Dateimanager/Ordnerstruktur mit PHP/MySQL vom 11.07.2010


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> Dateimanager/Ordnerstruktur mit PHP/MySQL
Autor Nachricht
bluespoon
Threadersteller

Dabei seit: 10.11.2006
Ort: Hannover
Alter: 41
Geschlecht: Männlich
Verfasst So 11.07.2010 23:12
Titel

Dateimanager/Ordnerstruktur mit PHP/MySQL

Antworten mit Zitat Zum Seitenanfang

Moin Lächel

Ich hab' hier grad ein echt kniffliges Problem - denke ich zumindest. Also … ich hab' ein Script gebaut,
in dem der User eine Art Dateimanager zur Verfügung stehen hat. Nun kann er dort verschiedene
Verzeichnisse anlegen. Soweit ist alles prima. Nun gibt es aber ein Select, in welchem der User
schnell zischen den einzelnen Verzeichnissen hin und her springen soll.

Mein erster Aufbau war einfach eine Abfrage nach allen Verzeichnissen zu der aktuellen User ID.
Nun wollte ich aber eine Struktur Wie diese hier haben:

Hauptverzeichnis
- Unterverzeichnis 1
- Unterverzeichnis 2
- - Unter-Unterverzeichnis 1
- - Unter-Unterverzeichnis 2
- Unterverzeichnis 3

Der User kann übrigens so viele Ebenen erstellen, wie er lustig ist.


Zuerst der Aufbau meiner MySQL Tabelle 'user_directories':





Identifiziert werden die Verzeichnisse über die 'directory_id'. Die 'parent_directory_number' eines Verzeichnisses
ist also die 'directory_id' des übergeordneten. Und nun meine Abfrage. Alles unwichtige hab' ich rausgenommen …

Code:
$query = "SELECT * FROM user_directories WHERE user_id = " . $user_id . " AND parent_directory_number = 0 ORDER BY directory_name ASC";
$result = my_sql::my_sql_query($query);
while($directory = my_sql::my_sql_fetch_obj($result))
{
   $directory_box .= "\t\t\t\t\t\t" . '<option value="' . $directory->directory_id . '">- ' . $directory->directory_name . '</option>' . "\n";
   
   $query_2 = "SELECT * FROM user_directories WHERE user_id = " . $user_id . " AND parent_directory_number = " . $directory->directory_id . " ORDER BY directory_name ASC";
   $result_2 = my_sql::my_sql_query($query_2);
   while($directory_2 = my_sql::my_sql_fetch_obj($result_2))
   {
      $directory_box .= "\t\t\t\t\t\t" . '<option value="' . $directory_2->directory_id . '">- - ' . $directory_2->directory_name . '</option>' . "\n";
      $l++;
   }
   
   $l++;
}

Edit: Ohne Highlightning schlecht zu lesen. Hier ist noch ein Screen:




Das liefert mir nun folgendes Ergebnis:





Damit bin ich eig. zufrieden. Aber was, wenn der User nun noch eine dritte und vierte Ebene
an Verzeichnissen aufbaut. Also meinetwegen …

Hauptverzeichnis
- Unterverzeichnis 1
- Unterverzeichnis 2
- - Unter-Unterverzeichnis 1
- - - Unter-Unter-Unterverzeichnis 1
- - - - Unter-Unter-Unter-Unterverzeichnis 1
- - Unter-Unterverzeichnis 2
- Unterverzeichnis 3

Ich kann doch net auf gut Glück 20 Schleifen ineinander packen … wo liegt denn jetzt mein
Denkfehler? Komme nämlich auf keine vernünftige Lösung hier *Schnief* Wenn an der Struktur
oder meinem Code noch was unklar ist, einfach fragen.

Mein Ansatz ist die äußere Schleife mit der ID 0 wie oben (das Hauptverzeichnis) und
anschließend EINE Schleife, die so lange "Kindschleifen" aufbaut, bis zu einem übergeordneten
Verzeichnis kein Unterverzeichnis mehr gefunden wird. Na ja … zu dem Ansatz fällt mir aber
beim Besten Willen keine Lösung ein :/


Danke und LG,

Patrick


Zuletzt bearbeitet von bluespoon am So 11.07.2010 23:17, insgesamt 1-mal bearbeitet
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Mo 12.07.2010 07:51
Titel

Antworten mit Zitat Zum Seitenanfang

Stichwort Rekursion:

http://de.wikipedia.org/wiki/Rekursion

Ist aber nicht die ideale Lösung, um Hierarchien in einer relationalen Datenbank zu durchlaufen, da ja pro Schleifendurchlauf n Queries abgesetzt werden, was schlicht ein Performancemangel ist. Besser ein Datenmodell, dass eine iterative Lösung erlaubt (NestedSets bspw, http://www.klempert.de/nested_sets/); oder alternativ ein Caching des kompletten Baums im Speicher/Dateisystem.
  View user's profile Private Nachricht senden
Anzeige
Anzeige
bluespoon
Threadersteller

Dabei seit: 10.11.2006
Ort: Hannover
Alter: 41
Geschlecht: Männlich
Verfasst Mo 12.07.2010 12:11
Titel

Antworten mit Zitat Zum Seitenanfang

Hi,

dank Dir Lächel Das Cachen der Daten erscheint mir sinnvoll. Auch meine bisherige Funktion um den aktuellen
Pfad auszugeben ist eher suboptimal. Die Ausgabe ist zwar korrekt ... aber hier muss ich schließlich auch
nur in eine Richtung (nach oben) gehen und keie Abzweigungen in der "Ordnerstruktur" nehmen.

Code:
   function current_path($user_id, $current_directory)
   {
      $path = '';
      $i = 1;
      
      if($current_directory == 0 || $current_directory == '0') $directory_data = false;
      else $directory_data = true;
      
      while($directory_data == true)
      {
         $query = "SELECT * FROM user_directories WHERE user_id = " . $user_id . " AND directory_id = " . $current_directory;
         $result = my_sql::my_sql_query($query);
         $directory = my_sql::my_sql_fetch_obj($result);
         
         if($i > 3) $path = ' / ... ' . $path;
         else $path = ' / <a href="#" onclick="return navigate_to_directory(' . $directory->directory_id . ');">' . $directory->directory_name . '</a>' . $path;
         
         $i++;
         
         $current_directory = $directory->parent_directory_number;
         if($current_directory == 0 || $current_directory == '0' || $i > 4) $directory_data = false;
      }
      
      $main_dir = '<a href="#" onclick="return navigate_to_directory(0);">Hauptverzeichnis</a>';
      
      return $main_dir . $path;
   }


Ausgabe: Hauptverzeichnis /Dir / Subdir
Oder eben: Hauptverzeichnis / ... / Dir / Subdir / Subdir

Wird zwar nur max viermal durchlaufen, sind aber trotzdem jedes Mal unnötige Abfragen. Und an der Baumstruktur
der User Verzeichnisse ändert sich ja nichts - bis ein Verzeichnis gelöscht, verschoben, umbenannt oder erstellt wird.

Also ... werde ich mir heute Abend mal ansehen. Besten Dank Lächel


LG Patrick
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
zweitaccount

Dabei seit: 25.01.2008
Ort: -
Alter: -
Geschlecht: -
Verfasst Di 13.07.2010 10:12
Titel

Antworten mit Zitat Zum Seitenanfang

Hi,
eine andere Möglichkeit wäre es, alles mit einem query zu holen
und dann in etwa so auszugeben:

Code:
<?php
function outPrintItems($items=false,$start=0,$level=0){
   if(!$items || !is_array($items)) return;
   $level++;
   foreach($items[$start] as $key => $item) {
      echo '<option value="'.$item['directory_id'].'" style="margin-left:'.(10*$level-10).'px">';
      echo $item['directory_name'].'['.$item['directory_id'].']';
      echo '</option>';
      if(isset($items[$key]) && is_array($items[$key])) {
         outPrintItems($items,$key,$level);
      }
   }
   $level--;
}

$result = mysql_query("SELECT * FROM user_directories WHERE user_id = '1' ORDER BY directory_name");
$items = array();
while($row = mysql_fetch_array($result)) {
   if(!isset($items[$row['parent_directory_number']])) $items[$row['parent_directory_number']] = array();
   $items[$row['parent_directory_number']][$row['directory_id']] = $row;
}
?>
<form action="#" method="post">
   <fieldset>
   <select name="dropdown">
   <?=outPrintItems($items);?>
   </select>
   </fieldset>
</form>


So könntest du beliebig viele 'Unterordner' darstellen.

Grüße
zweitaccount

Btw: Google Chrome stellt gar kein margin-left in <option> dar
sehe ich gerade. Müsstest Du dir was anderes einfallen lassen...
  View user's profile Private Nachricht senden
 
Ähnliche Themen [Suche] Dateimanager mit Mitgliederverwaltung
Ordnerstruktur ausdrucken
winzip 8.0 > ordnerstruktur erhalten?
[Typo3] Designvorlage - Ordnerstruktur importieren
Ordnerstruktur für Projekte innerhalb eines Unternehmens
Ordnerstruktur von Website anzeigen ohne FTP-Programm
Neues Thema eröffnen   Neue Antwort erstellen
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.