[php] verzeichnisse auslesen

Hallo liebe Leute,
ich könnte ein wenig hilfe benötigen, bin in php nicht gerade erfahren und würde gerne via php ein verzeichniss auslesen, in welchem Unterordner vorhanden sind, in welchen wiederrum Bilder gespeichert sind...

die Daten /Verzeichniss/dateiname.jpg
sollen in einer MySQL Datenbank gespeichert werden, wodurch ich mir erhoffe die Bilder dann auf der Homepage anzeigen lassen zu können.

Ich benötige "nur" Hilfe beim auslesen der Verzeichniss und beim speichern deren Inhalt dann in der DB zu speichern.

Wäre richtig toll wenn ihr mir am besten schon so eine art fertiges Script übermitteln könntet oder wenigstens ein paar brauchbare referenzen (wobei ich brauchbar als anfänger eher anderst definiere :D)

Vielen Dank im Vorraus
 
Zuletzt bearbeitet:
Ein fertiges Script wird dir hier wohl keiner vor die Nase setzten. Aber du kannst dir einmal die Funktionen opendir() und readdir() anschauen. Allgemein ist das Handbuch unter php.net eigentlich eine sehr gute Referenz, die einem die meisten einfachen Fragen schon beantwortet.

Wenn dir das nicht weiter hilft, dann wäre es ganz nützlich, wenn du deinen bisherigen Code einmal posten würdest und genau erklärst, wo du Probleme hast.
 
ein fertiges script wäre auch zu schön gewesen :D aber ich hab auf den fall gebaut das jemand lange Weile und das nötige Wissen bereits besitzt :D

danke, werde mir die links noch genauer anschauen, sieht aufjedenfall ziemlich gut aus =)
 
danke an alle bis jetzt,... hab nun ein kleines problem!
und zwar hab ich das script so mehr oder weniger zusammen gebastelt bekommen, es liest mir das komplette verzeichnis aus und zeigt mir die dateien auch in einem <img> container an,...
zuerst habe ich in meine datenbank 1 geschrieben (verzeichnisnamen und dateinamen(pfade)) in eine tabelle -> hat funktioniert

jetzt würde ich gerne in db2 schreiben und zwar besitzt diese db eine tabelle namens index in der die verzeichnisnamen gespeichert werden, um später als links verwendet werden zu können! Aus jedem Verzeichnisnamen soll noch zusätzlich eine tabelle in db 2 erstellt werden in welche alle Dateipfäde gespeichert werden um diese dann später auf der page anzeigen zu können.

mein code:
PHP:
<html>
<head></head>
<body>
<?php
  


function vzread($pfad = ".", $dirname)
    {
$verbindung = mysql_connect("localhost", "meinname" , "meinpw")
or die("Verbindung zur Datenbank konnte nicht hergestellt werden");
mysql_select_db("meinedvb") or die ("Datenbank konnte nicht ausgewählt werden");


        $dir = dir($pfad);
        
        while(false !== ($file = $dir->read()))
        {
            if(("."  == $file) OR
               (".." == $file))
                continue;
            if(is_dir($pfad."/".$file)) {
                


//Tabelle mit Verzeichnisnamen erstellen
$eintrag = "CREATE TABLE $file (id int(255) NOT NULL auto_increment, pfad varchar(255) NOT NULL, PRIMARY KEY (id) )";
$eintragen = mysql_query($eintrag);






//Verzeichnis eintragen                
$eintrag = "INSERT INTO index (typ, pfad) VALUES ('dir', '$file')";
$eintragen = mysql_query($eintrag);


                
                echo($pfad."/".$file."<br >\n");
                vzread($pfad."/".$file, $file);
                 
            } else {

//Bilder Pfad eintragen
$eintrag = "INSERT INTO $dirname (pfad) VALUES ('$pfad/$file')";
$eintragen = mysql_query($eintrag);

                echo($pfad."/".$file."<br >\n");
                echo"<img src=\"$pfad/$file\" width=120 height=130><br>";
            }
        }
        $dir->close();
    }
?>


<?php
    
    echo "In /Bilder liegt: <br />\n";
    vzread('Bilder', 'blubb');
?>
</body>
</html>

Fazit: Keine Fehlermeldung, die Bilder werden korrekt angezeigt, die Pfäde werden ausgegeben,... aber mySql technisch keine Reaktion, weder in Form einer Fehlermeldung noch in Form eines Wertes in der db *hmmpf*

Bin absolut ratlos,... und versuche schon seit 3 stunden so ziemlich alles was mir so einfällt,...
 
Ich verstehe noch nicht so ganz, was du überhaupt erreichen willst. Warum legst du z.B. für jedes Unterverzeichnis eine neue Tabelle an? Schilder doch bitte noch einmal, welches Problem du genau lösen möchtest, dann können wir dir zunächst einmal mit einer geeigneten Datenbankstruktur helfen.

Um dir den MySQL-Fehler ausgeben zu lassen schau dir einmal mysql_error() an.
 
Ich hab Deinen Code mal geordnet...
Als erstes: Du benutzt nur eine DB - obwohl Du von zweien sprichst.
Dann willst Du die Bilder in eine Tabelle mit dem Wert $dirname eintragen - existiert die denn überhaupt?
Bei der Erstellung der Tabelle(n) für die einzelnen Verzeichnisse solltest Du beachten, dass sich Sonderzeichen, Freizeichen etc. nicht besonders gut in Tabellennamen machen.

PHP:
<?php
function vzread($pfad = ".", $dirname)
{
$verbindung = mysql_connect("localhost", "meinname" , "meinpw") or die("Verbindung zur Datenbank konnte nicht hergestellt werden");

mysql_select_db("meinedvb") or die ("Datenbank konnte nicht ausgewählt werden");

$dir = dir($pfad);
        
while(false !== ($file = $dir->read()))
{
     if(("."  == $file) OR (".." == $file))
        continue;

     if(is_dir($pfad."/".$file))
     {
        //Tabelle mit Verzeichnisnamen erstellen
         $eintrag = "CREATE TABLE $file (id int(255) NOT NULL auto_increment, pfad varchar(255) NOT NULL, PRIMARY KEY (id) )";
        $eintragen = mysql_query($eintrag);

        //Verzeichnis eintragen                
         $eintrag = "INSERT INTO index (typ, pfad) VALUES ('dir', '$file')";
         $eintragen = mysql_query($eintrag);

       
        echo($pfad."/".$file."<br >\n");
        vzread($pfad."/".$file, $file);
                 
     }
     else
     {
        //Bilder Pfad eintragen
        $eintrag = "INSERT INTO $dirname (pfad) VALUES ('$pfad/$file')";
         $eintragen = mysql_query($eintrag);

        echo($pfad."/".$file."<br >\n");
        echo"<img src=\"$pfad/$file\" width=120 height=130><br>";
     }
}

$dir->close();
}

    
echo "In /Bilder liegt: <br />\n";
vzread('Bilder', 'blubb');
?>
 
ich spreche von zweien da ich auf meiner kompletten homepage 2 datenbanken benutze.

beim rest hab ich selbst noch nen kleinen fehler, stimmt schon, hier nochmal korrigiert bzw offensichtlicher($dirname soll ja erst erstellt werden)

das Problem ist nachwievor das sich eben nix tut in meiner zweiten datenbank - nichts :/

danke für den Hinweis mit den leerzeichen usw. werde ich heute abend sobald ich zuhause bin in angriff nehmen :)
PHP:
 <?php
function vzread($pfad = ".", $dirname)
{
$verbindung = mysql_connect("localhost", "meinname" , "meinpw") or die("Verbindung zur Datenbank konnte nicht hergestellt werden");

mysql_select_db("meinedb") or die ("Datenbank konnte nicht ausgewählt werden");

$dir = dir($pfad);
        
while(false !== ($file = $dir->read()))
{
     if(("."  == $file) OR (".." == $file))
        continue;

     if(is_dir($pfad."/".$file))
     {
         $dirname = $file;
        //Tabelle mit Verzeichnisnamen erstellen
         $eintrag = "CREATE TABLE $dirname (id int(255) NOT NULL auto_increment, pfad varchar(255) NOT NULL, PRIMARY KEY (id) )";
        $eintragen = mysql_query($eintrag);

        //Verzeichnis eintragen                
         $eintrag = "INSERT INTO index (typ, pfad) VALUES ('dir', '$file')";
         $eintragen = mysql_query($eintrag);

       
        echo($pfad."/".$file."<br >\n");
        vzread($pfad."/".$file, $dirname);
                 
     }
     else
     {
        //Bilder Pfad eintragen
        $eintrag = "INSERT INTO $dirname (pfad) VALUES ('$pfad/$file')";
         $eintragen = mysql_query($eintrag);

        echo($pfad."/".$file."<br >\n");
        echo"<img src=\"$pfad/$file\" width=120 height=130><br>";
     }
}

$dir->close();
}

    
echo "In /Bilder liegt: <br />\n";
vzread('Bilder', 'blubb');
?>
 
Das Problem ist nach wie vor, dass du uns nicht sagst, was du vor hast. Du hast weder meine noch sTEks Fragen beantwortet. Wie sollen wir dir da helfen? Also nochmal die Frage, was du genau erreichen willst? Scheinbar ja nicht nur die Pfade der Bilder in eine Datenbank schreiben.
Dein Code benutzt nur eine DB, aber du redest immer von zweien. Wie hängen die zusammen und in welche soll was geschrieben werden?
Existiert die Tabelle blubb überhaupt? Denn nur für Unterverzeichnisse von /Bilder wird ja eine neue Tabelle mit dem Verzeichnisnamen angelegt, sodass die Infos zu Dateien, die direkt in /Bilder liegen nach blubb geschrieben werden.
 
okay,... das blubb ist schwachsinn, da diese tabelle nicht existiert, allerdings werden auch keine dateien direkt in /bilder vorhanden sein....
ich will die ordnernamen die sich in /bilder befinden in die tabelle index schreiben sodas ich mir später diese namen als link auf der homepage ausgeben lassen kann. Die Ordner die sich in /Bilder befinden sollen jeweils eine Tabelle mit dem Namen des Ordners bekommen. Dort möchte ich die Dateipfäde der, in den Ordnern befindlichen Dateien speichern...
Und später möchte ich eben auf der Homepage den Ordnernamen ausgeben lassen als link, und wenn dieser aufgerufen wird sollen dann die Daten (Bilder) auf der seite ausgegeben werden.

-> Will ein script das mir den Inhalt des Verzeichnisses Bilder nach Ordnern sortiert ausgibt, jedoch immer nur einen Ordner der vom User ausgewählt wird. Ein Foto-Archiv sozusagen...

Ich hoffe das ich nun alle Fragen beantworten konnte...

PS: Ich rede von zweien weil andere Script's auf der page eine andere Datenbank benutzen
 
Gut, da sind wir doch schon mal einen großen Schritt weiter ;)

Für jedes Verzeichnis eine eigene Tabelle anzulegen halte ich dann für keine gute Idee. Erzeuge dir lieber einmalig zwei Tabellen. In die eine speicherst du deine Verzeichnisse zusammen mit einer ID. In die Zweite speicherst du die Dateinamen und die ID des Ornders in dem sie liegen, so dass du anhand dieser ID den Verzeichnisnamen aus der ersten Tabelle auslesen kannst.
Wenn du dann alle Bilder aus einem bestimmten Verzeichnis haben möchtest, holst du dir zuerst dessen ID und liest dann alle Bilder zu dieser ID aus.

Wenn man möchte, kann man in der Tabelle mit den Verzeichnissen auch die Verzeichnisstruktur mit abbilden, indem man eine dritte Spalte einfügt und jeweils die ID des übergeordneten Verzeichnisses dort ablegt.
 
Okay herzlichen dank, werde ich nachher gleich mal in angriff nehmen,...

Zwei Fragen hätte ich noch:
1. wie bekomm ich hin das mein script nur bestimmte dateitypen einliest (jpg, gif, png)?

2. Ich würde gerne die Bilder die nachher auf der page angezeigt werden anklicken können, sodas diese dann im großformat erscheinen,... ohne das die seite neugeladen werden muss, und ohne auf eine andere seite weitergeleitet zu werden,... wie funktioniert sowas?
 
1. wie bekomm ich hin das mein script nur bestimmte dateitypen einliest (jpg, gif, png)?

Die einfachste Möglichkeit wäre du überprüfst die Dateiendung. Das lässt sich natürlich relativ leicht manipulieren, denn mich hindert nichts daran diese einfach zu ändern.
Eine weitere Möglichkeit wäre, den MIME-Typ zu ermitteln. Dazu kannst du dir einmal finfo_file() anschauen. Ich habe dunkel im Hinterkopf, dass man sich auch darauf nicht wirklich verlassen konnte, bekomme aber gerade nicht mehr zusammen, warum.

2. Ich würde gerne die Bilder die nachher auf der page angezeigt werden anklicken können, sodas diese dann im großformat erscheinen,... ohne das die seite neugeladen werden muss, und ohne auf eine andere seite weitergeleitet zu werden,... wie funktioniert sowas?

Hier ist wohl AJAX das Stichwort. Es gibt dafür bereits einige recht mächtige Bibliotheken, für die eine Menge Beispiele im Netz existieren und dir etwas Arbeit abnehmen. Ein recht bekannter Kandidat wäre jQuery. Gibt aber noch eine Reihe mehr MooTools, QooXDoo, etc.
Vielleicht reicht es aber auch schon, wenn du dich ein wenig in JavaScript einließt und dir diese spezielle Funktionalität kurz selber schreibst. Ich habe nicht wirklich Erfahrung mit AJAX...
 
Die einfachste Möglichkeit wäre du überprüfst die Dateiendung. Das lässt sich natürlich relativ leicht manipulieren, denn mich hindert nichts daran diese einfach zu ändern.
Eine weitere Möglichkeit wäre, den MIME-Typ zu ermitteln. Dazu kannst du dir einmal finfo_file() anschauen. Ich habe dunkel im Hinterkopf, dass man sich auch darauf nicht wirklich verlassen konnte, bekomme aber gerade nicht mehr zusammen, warum.

weil man damit bei php nicht sicher umgehen konnte....

eine möglichkeit wäre das erstmal sogut wie möglich rausfiltern und dann für das upload verzeichnis eine ausführung von php datein und ähnliches zu verbieten bei htaccess....
so könnnten zwar gefährliche scripte drinne laden aber der angreifer kann sie net ausnutzen weil die datei nicht ausgeführt werden darf....
 
also das script tut's jetzt soweit (einlesen in die db )
den rest bekomm ich schon irgendwie hin & falls ich nochmal's ein paar geniale hirne brauch, wende ich mich wieder an euch =)

noch zum abschluss meinen quelltext (nicht schön aber selten):

PHP:
<html>
<head></head>
<body>
<?php
  
include 'php/connect.php';

function vzread($pfad = ".", $id)
    {



        // Der Punkt ist das aktuelle Verzeichnis
        // .. kennt man als "Verzeichnis höher"
        // dir/ als "Verzeichnis tiefer"
        $dir = dir($pfad);
        
        while(false !== ($file = $dir->read()))
        {
            if(("."  == $file) OR
               (".." == $file))
                continue;
            if(is_dir($pfad."/".$file)) {
                
$abfrage = "SELECT name FROM pindex WHERE name LIKE '$file' LIMIT 1";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);
$name = $row->name;


if($name != $file)
{
//Verzeichnis eintragen                
$eintrag = "INSERT INTO pindex (name) VALUES ('$file')";
$eintragen = mysql_query($eintrag);
}

//Die ID abfragen und in die variable $id speichern die dann beim neuaufruf der funktion übergeben wird =)
$abfrage = "SELECT id FROM pindex WHERE name LIKE '$file' LIMIT 1";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);
$id = $row->id;



                
                echo($pfad."/".$file."<br >\n");
                vzread($pfad."/".$file, $id);
                 
            } else {

$abfrage = "SELECT pfad FROM bilder WHERE pfad LIKE '$pfad/$file' AND ordner_id = '$id' LIMIT 1";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);
$name = $row->pfad;

$aktu_pfad = $pfad."/".$file;


if($name != $aktu_pfad)
{
//Bilder Pfad eintragen
$eintrag = "INSERT INTO bilder (ordner_id, pfad) VALUES ('$id', '$pfad/$file')";
$eintragen = mysql_query($eintrag);
}
                
echo($pfad."/".$file."<br >\n");
                echo"<img src=\"$pfad/$file\" width=120 height=130><br>";
            }
        }
        $dir->close();
    }
?>





<?php
    
    echo "In /Bilder liegt: <br />\n";
    vzread('Bilder', '1');
?>
</body>
</html>

mfg selig :)
 
eine möglichkeit wäre das erstmal sogut wie möglich rausfiltern und dann für das upload verzeichnis eine ausführung von php datein und ähnliches zu verbieten bei htaccess....
so könnnten zwar gefährliche scripte drinne laden aber der angreifer kann sie net ausnutzen weil die datei nicht ausgeführt werden darf....


mmmh, ja klingt nicht schlecht, ich will die dateien aber über einen ftp client wie z.B. filezilla hochladen,... ausser mir hat niemand zugriff auf den server - ich will nur umgehen das thumbs.db dateien in meiner seite als bild eingebunden werden (würde glaube ich leicht merkwürdig aussehen :D )

danke für euer bemühen
 
okay, hier bin ich nochmal schnell,... :D
und zwar bräuchte ich noch hilfe hierbei:

PHP:
echo "<table align=\"center\" border=\"0\" width=\"90%\">";
       $i = "1";

while($ausgabe = mysql_fetch_object($ergebnis))
             {
             
if($i == "1" OR $i =="5"){
echo "<tr>"; 
    }

       echo "<td><img src=\"../$ausgabe->pfad\" width=120 height=130> </td> ";
if($i == "5"){
$i = 1;
echo "</tr>";
}    

             }
    
echo "</table>";

Ich möchte das meine Bilder in einer Tabelle ausgegeben werden, und nach 5 Bildern eine neue Spalte angefangen wird. Allerdings funktioniert das so^^ irgendwie nicht. und mit einer for schleife haut das auch nicht hin, da ich meine Bilder dann vermutlich 5 mal angezeigt bekomme und sich sonst vermutlich auch nix weiter tut.

Gute Nacht, und danke im Vorraus

selig
 
Ungetestet...

PHP:
echo '<table align="center" border="0" width="90%">';

$i = 0;

while($ausgabe = mysql_fetch_object($ergebnis))
{
    if($i % 5 == 0)
    {
        echo '<tr>';
    }

    echo '<td><img src="http://www.hackerboard.de/' . $ausgabe->pfad . '" width=120 height=130></td>';
    ++$i;

    if($i % 5 == 0)
    {
        echo '</tr>';
    }
}

echo '</table>';
 
Zurück
Oben