php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Verzeichnis auslesen


 
chrissie82
22-11-2005, 18:33 
 
Ich versuch ein Verzeichnis auszulesen. Der Verzeichnispfad ist in der Datenbank in der Spalte "link" wie folgt gespeichert: C:\\Inetpub\\...
Nun möchte ich mir die dazugehörigen Unterverzeichnisse und Dateien anzeigen lassen... bisher leider erfolglos... Mein mometaner Code sieht so aus:


$userid = $_SESSION['user_id'];
$erg = mysql_query("SELECT link FROM dream WHERE id = '$userid';");
$row = mysql_fetch_object($erg);
$link = $row->link;

function readDirectory($dir = ".$link") {
$result = array();
if ( $d = openDir($dir) ) {
while ( $f = readDir($d) ) {
if ( !preg_match("/^.|..$/", $f) ) {
if ( is_dir($f) ) $result[$f] = readDirectory("{$dir}/{$f}");
else $result[$f] = filesize("{$dir}/{$f}");
}
}
closeDir($d);
}
return $result;
}

Aber damit scheint es nich zu funktionieren... hat jemand eine Idee??

 
hhcm
22-11-2005, 18:37 
 
Sorry, aber

Ich hab das und das probiert und DAS funktioniert nicht..

ähm.. WAS funktioniert nicht..

:confused:


function() { }

hast du deklariert aber du benutzt sie nicht

 
derHund
22-11-2005, 18:38 
 
scheint nicht zu funktionieren? :respekt:

fehlermeldungen? rufst du die funktion überhaupt auf?

 
thommyk
22-11-2005, 18:41 
 
Und was soll das ($dir = ".$link") bewirken?

An den Inhalt von $dir noch $link dranhängen? Das wird so nicht gehen.

 
hhcm
22-11-2005, 19:05 
 
Original geschrieben von thommyk
Und was soll das ($dir = ".$link") bewirken?

An den Inhalt von $dir noch $link dranhängen? Das wird so nicht gehen.

Bitttttteeee erst lesen dann posten..

$dir = ".$link" hängt bestimmt nichts an $dir an.. Verunsicher die leute hier nicht so..

 
chrissie82
22-11-2005, 19:10 
 
Ja, genau in dieser Zeile liegt auch mein Problem...
Aber $dir steht doch für das Verzeichnis, oder??
Und mein Verzeichnis steht in der Datenbank, in der Spalte $link...
deswegen:

function readDirectory($dir = ".$link")

Und wegen der Zeile krieg ich auch n Fehler... und zwar Folgenden:

Parse error: parse error in c:\inetpub\wwwroot\logintest\logo.php on line 22

Ich weiß aber im Moment nicht was daran falsch ist...

 
hhcm
22-11-2005, 19:11 
 
Welche Zeile ist denn Zeile 22 ???

.....du hast den sinn von Funktionen immer noch nicht verstanden


function tuwas($variable)
{
echo $variable;
}
// Bewirkt noch gar nichts

tuwas("Hallo");

// Gibt hallo aus

// -----

function tuwasanderes($link)
{
return $link;
}

// Macht ebenfalls nichts

$var = tuwasanderes("Hallo");

// In $var ist nun Hallo enthalten


Deine funktion sollte so aussehen

function readDirectory($dir) { // usw }


Am ende deines Scripts musst du


$ergebnis = readDirectory($link); // Ergebnis speichern
print_r(readDirectory($link)); // Ergebnis als dump zeigen

 
thommyk
22-11-2005, 19:24 
 
Na die hier: function readDirectory($dir = ".$link")
@hhcm
Deswegen kriegt er ja den Fehler, was er auch geschrieben hat. Vielleicht solltest Du mal lesen vorm fragen.

Ausserdem hab ich nicht gesagt, dass damit $link an $dir drangehängt wird, sondern vermutet, dass er dass versucht. Das ist doch wohl ein Unterschied.

@chrissie82
Es geht nicht, weil man als default-Wert für an Funktionen übergebene Variablen keine andere Variable verwenden kann!

 
chrissie82
22-11-2005, 19:31 
 
diese Zeile:

function readDirectory($dir = ".$link")

 
hhcm
22-11-2005, 19:34 
 
An den Inhalt von $dir noch $link dranhängen? Das wird so nicht gehen.


Sieht für mich nicht nach einer Vermutung aus..

Und du hast den Sinn von funktionen nicht verstanden ist das gleiche was du gerade in kurzform sagtest...

 
chrissie82
22-11-2005, 19:43 
 
Erstmal vielen Dank für die superschnellen Antworten... habe das jetzt mal umgeschrieben... aber nun wird mir gar nichts mehr ausgegeben...
meine Funktion sieht jetzt wie folgt aus:


function readDirectory($dir) {
$result = array();
if ( $d = openDir($dir) ) {
while ( $f = readDir($d) ) {
if ( !preg_match("/^.|..$/", $f) ) {
if ( is_dir($f) ) $result[$f] = readDirectory("{$dir}/{$f}");
else $result[$f] = filesize("{$dir}/{$f}");
}
}
closeDir($d);
}
return $result;
$ergebnis = readDirectory($link); // Ergebnis speichern
print_r(readDirectory($link)); // Ergebnis als dump zeigen
}

 
thommyk
22-11-2005, 19:44 
 
@hhcm
Und du hast den Sinn von funktionen nicht verstanden ist das gleiche was du gerade in kurzform sagtest...
Du warst etwas schneller beim posten. Da war ich noch beim Schreiben.

aber nun wird mir gar nichts mehr ausgegeben...
Dann lass Dir doch mal $link ausgeben bzw. mach Dir ein paar Testausgaben in der function. Sollen wir jetzt in der Glaskugel lesen, woran es liegen könnte?

AAAhh: Ich glaub mich tritt ein Pferd: Du rufst Deine Funktion in der Funktion auf. Dein Skript hat sich schlichtweg aufgehängt, weil es in einer Endlosschleife läuft..

Der Aufruf der Funktion muss AUSSERHALB der Funktion liegen. Vielleicht solltest Du mal wirklich Grundlagen über Funktionen lernen, da hat hhcm recht.

 
chrissie82
22-11-2005, 20:10 
 
Entschuldigt bitte, aber ich bin absolute Anfängerin in php!!
Nun ja, habe jetz die besagte 2 Ausgabezeilen AUSSERHALB der Funktion zu stehen, und als Ausgabe wird mir jetzt:

Array ( )

angezeigt... :( :( :(

 
thommyk
22-11-2005, 20:29 
 
Nochmal die Frage: Was steht in $link drin, bevor Du die Funktion aufrufst? Ausgaben?
Ist das das richtige Verzeichnis?

Probier mal

function readDirectory($dir) {
echo $dir.'<br>';
$result = array();
if ( $d = openDir($dir) ) {
while ( $f = readDir($d) ) {
echo $f.'<br>';
if ( !preg_match("/^.|..$/", $f) ) {
if ( is_dir($f) ) $result[$f] = readDirectory("{$dir}/{$f}");
else $result[$f] = filesize("{$dir}/{$f}");
}
}
closeDir($d);
}
else echo $dir.' konnte nicht geoeffnet werden<br>';
return $result;
}

print_r(readDirectory($link)); // Ergebnis als dump zeigen
Was kommt raus?

 
chrissie82
22-11-2005, 21:15 
 
Ok, hab ich probiert... scheint wohl mit dem "$link" zusammenzuhängen...
wenn ich dieses vorher mit echo aufrufe, dann erscheint als ausgabe $link...
und mit der neuen Funktion erscheint "konnte nicht geoeffnet werden.

Meine Link-Spalte in der Tabelle erhält folgenden Wert:

c:\\Inetpub\\wwwroot\\logintest\\geodaten\\20_chrissie1982

Das ist auch der richtige Pfad... allerdings hab ich festgestellt das die Spalte großgeschrieben ist, deswegen hab ich eine Zeile geändert:

$link = $row->Link;

aber leider immer noch kein Erfolg...
ich hatte aber vorher schonmal etwas anderes probiert, um mir das Verzeichnis anzeigen zu lassen... Und damit wurde es auch angezeigt... nur leider keine weiter Unterverzeichnisse... also muss das ja irgendwie funktionieren mit dem $link...

 
cheC
22-11-2005, 22:54 
 
... und wennste ein anderes script verwendest - wär' das schlimm?

Ich hab so ziemlich überhaupt keine Ahnung was php ist, für mich sind php - Dateien sowas Ähnliches wie es die exe - Dateien sind, die ich auf meinen M$ Win - harddrives finde und die ich zur Ausführung irgendeiner Funktion anklicke. Darum kann ich zu den Fragen zu Deinem Script nix Konstruktives beifügen, sorry.

Ich verwende das folgende Ding um auf meinen Webspeicherplätzen spazieren zu gehen. Ich modifiziere es von Fall zu Fall, meistens mit html - Befehlen (ebent weil ich mit php nicht zurecht komme).
Ich hänge im nächsten Beitrag noch ein anderes script an, mit dem man nicht in einzelne Directories reingucken kann, sondern das Directories samt enthaltenen Dateien auflistet - so 'ne Art totale sitemap.
Vielleicht kannste damit Dein Ziel erreichen?

Ich nenne die folgende Datei walk_t wobei das t für Text steht. Eine andere, ähnliche Datei (von dieser hier abgeleitet) kann Bilder anzeigen, sie heißt walk_p wobei p für picture steht und eine Kombination aus beiden nenne ich walt_tp, wobei beides angezeigt wird, Dateinamen als auch das zugehörige Bild.

<?php

# Do we have a path? if not, it's the current directory
$path = $_GET["path"];
if( !isset( $path ) || $path == "" ) {
$path = ".";
}

# Print out for navigation
echo "current path: <b>" . $path . "</b><br />\n";

echo "&nbsp;<br><b>directories</b><br />\n";

# Initialise list arrays, directories and files separately and array counters for them
$d_arr = array(); $d = 0;
$f_arr = array(); $f = 0;

# Open possibly available directory
if( is_dir( $path ) ) {
if( $handle = opendir( $path ) ) {
while( false !== ( $file = readdir( $handle ) ) ) {

# Make sure we don't push parental directories or dotfiles (unix) into the arrays
if( $file != "." && $file != ".." && $file[0] != "." ) {
if( is_dir( $path . "/" . $file ) )

# Create array for directories
$d_arr[$d++] = $file;
else

# Create array for files
$f_arr[$f++] = $file;
}
}
}
}

# Wrap things up if we're in a directory
if( is_dir( $handle ) ) closedir( $handle );

# Sort and reset the arrays
asort( $d_arr ); reset( $d_arr );
asort( $f_arr ); reset( $f_arr );

# Print a parent directory link
$d_prev = substr( $path, 0, ( strrpos( dirname( $path . "/." ), "/" ) ) );

// insert
// please do not show me a faked link, you naughty boy!
if ($path == ".") { echo "parent directory - weita rauf gez nich mer<br />\n";
}
else
// /insert

echo "<a href=\"?path=" . $d_prev . "\">parent directory</a><br />\n";

# Print the directory list
for( $i=0; $i < count( $d_arr ); $i++ ) {

# Print with query string
echo "<li> <a href=\"?path=" . $path . "/" . $d_arr[$i] . "\">" . $d_arr[$i] . "</a>/<br />\n";

# Alternate, without the "[ D ]" for "directory",
# delete "[ D ] " (note the white space) in the echo line

}

echo "</ol><ol>\n";

echo "<b>files</b><br />\n";
# Print file list
for( $i=0; $i < count( $f_arr ); $i++ ) {

# Only print path and filename

# verberge index.htm usw
if( "$f_arr[$i]" != "index.htm" )
if( "$f_arr[$i]" != "walk_t.php" )
#echo "<br>ich habe ihn!<br>";

echo "<li> <a href=\"" . $path . "/" . $f_arr[$i] . "\"> " . $f_arr[$i] . "</a>";

echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";

# Alternate, without the "[ F ]" for "file",
# delete "[ F ] " (note the white space) in the echo line


# Alternate, without file size function, this is the correct place to comment it out
# delete the "#" sign in front of "/" and "*" after last line of this comment
# and follow the last "Alternate" recommendation below
# Both must be done - or nothing. One comment lonely results in an error message.
# Without white space between slash and asterix.


# We may want a file size. NOTE: needs $path to stat
if( filesize( $path . "/" . $f_arr[$i] ) >= 1024 ) {

# verberge index.htm usw
if( "$f_arr[$i]" != "index.htm" )
if( "$f_arr[$i]" != "walk_t.php" )
#echo "<br>ich habe ihn!<br>";

# Size in kilobytes
echo " " . round( filesize( $path . "/" . $f_arr[$i] ) / 1024, 1 ) . " KB<br />\n";
} elseif( filesize( $path . "/" . $f_arr[$i] ) >= 1048576 ) {

# verberge index.htm usw
if( "$f_arr[$i]" != "index.htm" )
if( "$f_arr[$i]" != "walk_t.php" )
#echo "<br>ich habe ihn!<br>";

# Size in megabytes
echo " " . round( filesize( $path . "/" . $f_arr[$i] ) / 1024 / 1024, 1 ) . " MB<br />\n";
} else {

# verberge index.htm usw
if( "$f_arr[$i]" != "index.htm" )
if( "$f_arr[$i]" != "walk_t.php" )
#echo "<br>ich habe ihn!<br>";

# Size in bytes
echo " " . filesize( $path . "/" . $f_arr[$i] ) . " bytes<br />\n";
}


# Without white space between asterix and slash.
# Alternate, without file size function, this is the correct place to comment it out
# delete the "#" sign in front of "*" and "/" before first line of this comment
# and look for the "Alternate" recommendation a few lines upwards.
# Both must be done - or nothing. One comment lonely results in an error message.
# And
# once the file size function is commented out, line breaks "<br />" are lost.
# To get them back, needs to uncomment also the following line.
#echo "<br />\n";

}

?>

:teach:

Die englischen Kommentare sind nur teilweise von mir.
Das Anzeigen der file sizes kann man durch Auskommentieren unterdrücken - muß dann aber ganz unten den Zeilenumbruch ent - kommentieren.

Wenn der code jemandem als föllich vermurxt vorkommt - dann bitte ich um Nachsicht.
Ich bin Laie.
Aber - dies Ding sollte eigentlich überall funktionieren - egal ob's ein X - oder Win - Server ist auf den es kopiert wird.


Ich wünsche Dir Glück damit - wenn es Dir überhaupt eine Hilfe ist.

 
cheC
22-11-2005, 23:51 
 
Bei diesem Script habe ich mir die Herkunft und Kommentare des Verfassers notiert. Bei vorangeganenem Script kann ich leider nicht mehr sagen woher ich es habe, möglicherweise von http://php.net/.

<?php

/*
http://de2.php.net/manual/de/ref.filesystem.php (Herkunft)

peeweek at altern dot org (Verfasser)
09-May-2003 02:06

here is a function that recurses all directories in a Windows Tree then displays for each directory its contents
*/


function ls ($curpath) {
$dir = dir($curpath);

#echo("<b>$curpath</b>");
#echo "<blockquote>";
while ($file = $dir->read()) {

if($file != "." && $file != "..") {
if (is_dir($curpath.$file)) {
echo("<b> $file / </b><br>");
#ls($curpath.$file."\\");
ls($curpath.$file."/");
} else {
echo("<dd><li> $file </li></dd>");
}
}
}
$dir->close();
#echo "</blockquote>";
return;
}

#Use:
#$startpath = "D:\\something\\";

ls($startpath);

?>

:teach:

$startpath muß beim obersten pub dir beginnen
möglicherweise gibt es eine weniger starre Lösung,
das Start dir zu finden. Ich finde das leidige Theater mit dem Herumsuchen nach dem Start dir stets gräßlich und um der Bequemlichkeit halber kopiere ich es aus den felermeldungen.

reales Beispiel
$startpath = "/var/nfsc1b/vchosts/username/domainname_dot_de/zu_durchsuchendes_directory/";

 
thommyk
23-11-2005, 12:01 
 
Hi Chrissi82, war gestern abend zu spät. Musste nach Hause.
Vergiss mal den den Kram von cheC, die function die Du hast reicht völlig aus.

Deine Query scheint nix zurück zuliefern, also liegt der Fehler wohl vorher,vielleicht schon bei der userid?
Was kommt denn raus, wenn Du

$userid = $_SESSION['user_id'];
$query = "SELECT link FROM dream WHERE id = '$userid'";
echo "Meine Abfrage: $query<br>";
$erg = mysql_query($query);
if (!$erg)
echo mysql_error();
else {
$row = mysql_fetch_object($erg);
print_r($row);
$link = $row->Link;
}probierst?

 
chrissie82
24-11-2005, 12:35 
 
Vielen Dank erstmal für eure Hilfe... weiß nicht was ich ohne euch machen würde...
@thommyk: Ich habe deine Version mal ausprobiert... und es sieht schon etwas besser aus, die Ausgabe ist Folgende:

Meine Abfrage: SELECT Link FROM dream WHERE id = '20'
stdClass Object ( [Link] => c:\\Inetpub\\wwwroot\\logintest\\geodaten\\20_chrissie1982 ) c:\\Inetpub\\wwwroot\\logintest\\geodaten\\20_chrissie1982
.
..
17237 Blankensee
Array ( )

Also 17237 Blankensee ist zumindest der nächste Unterordner in 20_chrissie1982... allerdings hat dieser dann noch 2 Unterordner, in denen dann die Bilder und pdf's liegen... Ich müßte mich also irgendwie zu denen durchklicken können... wie könnt ich denn das jetzt machen??
Ich schreibe den Pfad auch nur aus dem Grund in die Datenbank, um sicherzustellen, dass nur der jeweilige User in sein Verzeichnis kommt... also jeder User hat seinen eigenen Ordner in der Datenbank, jeweils zusammengesetzt aus ID und Benutzername... Und dann will ich anhand von ID und Benutzername prüfen, ob jemand Zugang hat oder nicht... hab ich mir zumindest so überlegt... hoffe das geht auch...

 
thommyk
24-11-2005, 15:30 
 
Wieso sind eigentlich die \ im Verzechnisnamen bei Dir doppelt, oder liegt das nur an der Ausgabe im Forum?.
Sollte eigentlich so aussehen:
c:\Inetpub\wwwroot\logintest\geodaten\20_chrissie1982

Immerhin scheint ja der SQL-Teil zu funzen und die Funktion wird auch richtig aufgerufen. Allerdings scheints dann beim nächsten Verzeichnis, das ja wieder mit der function durchgegangen werden soll, hängen zu bleiben und $result wird auch nicht richtig gespeichert.
Ich hab mal die {} Klammern rausgenommen und die Ausgabe erweitert.

function readDirectory($dir) {
echo 'Startverzeichnis'.$dir.'<br>';
$result = array();
#wenn Verzeichnis, dann durchsuchen
if ( $d = openDir($dir) ) {
while ( $f = readDir($d) ) {
#Datei- oder Verzeichnisname ausgeben
echo 'Datei gefunden:'.$f.'<br>';
#wenn nicht . oder ..
#(Verzeichnis selbst bzw. übergeord. Verzeichnis
if ( !preg_match("/^.|..$/", $f) ) {
#Beim Verzeichnis funktion wieder aufrufen mit diesem Name
if ( is_dir($f) ) {
echo "durchsuche Unterverzeichnis $f<br>";
$result[$f] = readDirectory("$dir/$f");
}
#Datei mit Dateigroesse speichern
else {
echo "speichere f$ in result<br>";
$result[$f] = filesize("{$dir}/{$f}");
echo '<pre>'; print_r($result); echo '</pre>';
}
}
}
#Verzeichniszeiger wieder schliessen
closeDir($d);
}
#Fehlermeldung bei nichtöffnen
else echo $dir.' konnte nicht geoeffnet werden<br>';
#Rückgabe Ergebnisarray
return $result;
}

$baum = readDirectory($link); // Ergebnis speichern
echo '<pre>'; print_r($baum);echo '</pre>'; //Ergebnis ausgaben


Sowas solltest Du dann aber langsam auch mal selbst machen können, auch als Anfänger. Fehlersuche heisst meistens Ausgaben, Ausgaben, Ausgaben, und diese dann Schritt für Schritt kontrollieren um den Fehler zu lokalisieren. :(

 
thommyk
24-11-2005, 15:33 
 
Und ein paar Kommentare hab ich auch mal reingemacht. Gewöhn Dir das besser an :teach: , sonst weisst Du später nicht mehr, was so ein Skript macht und musst es wieder mühsam durchgehen.

 
chrissie82
24-11-2005, 17:09 
 
Vielen Dank für die Mühe, die du dir mit mir machst...
Ich habe das Verzeichnis mit den doppelten / in der Datenbank abgelegt... hatte irgendwo gelesen das man das so machen sollte... braucht man es denn nicht??
Irgendwie scheint die Funktion keine Unterverzeichnisse zu finden...
ich werd mal noch bissl was damit probieren...
Die Ausgabe sieht momentan so aus:


Meine Abfrage: SELECT Link FROM dream WHERE id = '20'
stdClass Object ( [Link] => c:\\Inetpub\\wwwroot\\logintest\\geodaten\\20_chrissie1982 ) Startverzeichnisc:\\Inetpub\\wwwroot\\logintest\\geodaten\\20_chrissie1982
Datei gefunden:.
Datei gefunden:..
Datei gefunden:17237 Blankensee

Array
(
)

 
thommyk
25-11-2005, 11:05 
 
Hi, war gestern schon weg.

Es liegt an Deinem regulären Ausdruck im preg_match. der war falsch.
Bei | muss man Klammern drum setzen.
Zweiter Fehler war beim is_dir($f) , das muss noch $dir mit bei.
Probier mal ab dem preg_match:


#wenn nicht . oder ..
#(Verzeichnis selbst bzw. übergeord. Verzeichnis
if (!preg_match("/^(.|..)$/ismU", $f) ) # bei | Klammer setzen
{
#Beim Verzeichnis funktion wieder aufrufen mit diesem Name
if ( is_dir($dir.'/'.$f) ) { #$dir davor!!
echo "durchsuche Unterverzeichnis $f<br>";
$result[$f] = readDirectory($dir.'/'.$f);
}
#Datei mit Dateigroesse speichern
else {
echo "speichere $f in result<br>"; flush();
$result[$f] = filesize($dir.'/'.$f);
#echo '<pre>'; print_r($result); echo '</pre>';
}
}

habs bei mir getestest, funzt einwandfrei. Die echo kannst Du dann später auskommentieren.

 
chrissie82
25-11-2005, 20:30 
 
Genial!!!! Es wird wirklich alles angezeigt!!! Vielen vielen Dank...
nur eine Frage hätte ich doch noch: Kann man die Ordner als Links anzeigen lassen?? So das nur immer der oberste Ordner dasteht und man sich dann durchklicken kann???

P.S.: Wenn ich mal nach Münster komme, dann lad ich dich aufn Kaffee ein!!! Hast mir echt super doll geholfen!! Vielen vielen Dank!!

 
cheC
25-11-2005, 21:17 
 
Original geschrieben von chrissie82

Ich habe das Verzeichnis mit den doppelten / in der Datenbank abgelegt... hatte irgendwo gelesen das man das so machen sollte... braucht man es denn nicht??



Das betrifft nur System - Pfade und auch nur mit Einschränkung, nicht aber - äh - öffentliche Pfade wie in Webseiten, die ja - mit eventuellen Ausnahmen - öffentlich sind.
System - das meint Software, mit der nur Server - Betreiber zu tun haben, nicht aber die Domain - Benutzer (es sei denn, sie führten Scripts aus, die ihre Pfade bis ins System hinauf reichen lassen müssen).
Öffentlich ist alles, das sich unterhalb des Servers WWW - Verzeichnisses befindet, das in Apache htdocs heißt.

Die Empfehlung zu doppelten und "verkehrt" herum stehenden slashes steht z. B. in Apache config files und gilt nur dann wenn Apache auf M$ Windows läuft weil M$ ebent die slashes in Pfadangaben analog zu M$ DOS nach rechts unten zeigt. Das erste slash stellt die Maskierung für das zweite slash dar. Es ist nur Zufall, daß das Maskierungszeichen ebenfalls ein slash ist, es könnte auch ein anderes Sonderzeichen oder eine Kette von Sonderzeichen sein.

M$ - Pfade sichtbar machen
Wer z. B. phpinfo.php auf einem Windows - Server aufruft, findet die System - Pfade (etwa "Path" aus der autoexec.bat) darin mit zwei nach rechts unten gerichteten slashes.

Ich habe seit Jahren solche Win - Server für Intranets laufen und - nur um zu sehen was passiert - die Pfade teilweise absichtlich entgegen o. a. Apache - Empfehlung angegeben - und das hat auch funktioniert. Da aber immer mehr Server auf Open Source - Software laufen, braucht man sich in Zukunft wohl noch kaum darum zu kümmern.

Man oder frau eachte PHP - Fehlermeldungen, darin sind die slashes nach rechts oben gerichtet - und passend dazu sollte man oder frau es ebent auch machen.

 
cheC
25-11-2005, 21:56 
 
Illustration dazu
Angenommen, Apache wäre in einem M$ Windows - Verzeichnis
D:\server\
installiert und

der Betreiber hätte die voreingestellte Apache - Verzeichnis - Ordnung übernommen und

hätte im öffentlichen Verzeichnis htdocs ein user - Verzeichnis bi_ha für Bienchen Hartmann angelegt und

Bienchen Hartmann hätte eine Domain namens my_hobbies.de und

der Server - Betreiber legte für sie ein Unterverzeichnis m_h_de an und

Bienchen Hartmann würde darin ein Bild namens lebkuchen.jpg ablegen,
dann
wäre der System - Pfad dahin
D:\\server\\apache\\htdocs\\bi_ha\\m_h_de\\lebkuchen.jpg,
der für den Server - Betreiber in dessen M$ Win - Oberfläche (z. B. im Filemanager Explorer) so erscheint
D:\server\apache\htdocs\bi_ha\m_h_de\lebkuchen.jpg,
und
der öffentliche Pfad wäre
http://www.my_hobbies.de/lebkuchen.jpg.

 
onemorenerd
25-11-2005, 22:03 
 
Original geschrieben von chrissie82
Kann man die Ordner als Links anzeigen lassen?? So das nur immer der oberste Ordner dasteht und man sich dann durchklicken kann???

Ja kann man, brauchst du nur folgende Zeile in die .htaccess-Datei zu schreiben:

Options +Indexes

Funktioniert allerdings nicht, wenn dein Provider oder allgemein die httpd.conf des Webservers dir dies nicht gestatten.

 
cheC
25-11-2005, 22:16 
 
Original geschrieben von chrissie82


Kann man die Ordner als Links anzeigen lassen?




if ( is_dir($dir.'/'.$f) ) { #$dir davor!!
echo "durchsuche Unterverzeichnis $f<br>";


durchsuche Unterverzeichnis $f

gegen

durchsuche Unterverzeichnis
<a href=\"".$dir.'/'.$f.'/' target=\"Zielrahmen oder - fenster\">$f</a>

tauschen.
Achtung
Auch im href - Befehl muß analog zu "#$dir davor!!" der Pfad "$dir" zum Unterverzeichnis"$f" angegeben sein.

 
cheC
25-11-2005, 22:31 
 
- aber wat machste wennde Dich in ein Unterverzeichnis reingeklickt hast - wie kommste da wieder raus (ohne Brausers Zurück - Batten oder javascript history back)?

Da guckste mal in das erste meiner beiden Scripts - da gibt es sowas wie "previous" dir, das zuletzt besuchte dir wird als klickbarer Verweis "parent directory" angeboten.

 
chrissie82
29-11-2005, 18:22 
 
Hm....
hab das jetz alles probiert und so... aber bekomme es leider nich zum laufen... es kommen immer wieder "parse-errors"

kannst mir mal ein Beispiel posten, wie ich deinen Code genau in meinen einbinde??
Und das Bild, was im Unterverzeichnis liegt, muss sich beim anklicken öffnen... wie funktioniert das??

 
cheC
29-11-2005, 22:01 
 
Original geschrieben von chrissie82
Hm....
hab das jetz alles probiert und so... aber bekomme es leider nich zum laufen... es kommen immer wieder "parse-errors"

kannst mir mal ein Beispiel posten, wie ich deinen Code genau in meinen einbinde??
Und das Bild, was im Unterverzeichnis liegt, muss sich beim anklicken öffnen... wie funktioniert das??


Meinst Du mich?

Ich habe vor ein paar Tagen eine kleine (nicht öffentliche - denn dazu ist das Out fit zu mager) Bilderausstellung damit gemacht. Da kannst Du es sehen, achte bitte auf die Adreßzeile, es sind die Scripts die ich walk_t, walk_tp und walk_p nannte. Diese scripts sind ja lediglich zur eigenen Orientierung eingerichtet - für öffentliche Angelegenheiten werden sie nicht verwendet.

Also - solltest Du mich gemeint haben - ich kopiere Dir die Scripts gern und helfe Dir bis Du sie bei Dir zum Laufen brachtest (was selbstredend auch andere Forumsteilnehmer tun können) - die Scripts sind ja wirklich nicht groß und kompliziert - es sollte darum recht fix gelingen.

http://haufenzeug.de/_m_p_/s/vernissagen/walk_t.php

Während des Spaziergangs sieht das oberste dir so aus
http://haufenzeug.de/_m_p_/s/vernissagen/walk_t.php?path=.

Man kann also einen Besucher mit dem angehängten Pfad in ein bestimmtes Verzeichnis führen, indem man aus gewünschtem Verzeichnis heraus die Brauser - Adresszeile kopiert.

Zurück geht's ümma mit "parent directory".

Verzeichnisse mit Namen 320 enthalten Bilder mit max 320 pix Kantenlänge, für 640 gilt das sinngemäß.

 
chrissie82
01-12-2005, 10:43 
 
Hallo cheC,

genau so möchte ich es bei mir auch haben!!!
Hast du vielleicht etwas Quelltext für mich??
Vielen Dank schonmal

Chrissie

 
pozy
01-12-2005, 13:44 
 
Ich hab hier jetz einige Unklarheiten über die Backlash/Slash Sache gehört...

Also wenn der Code sowohl unter Linux wie auch Windows laufen soll, nehmt einfach einen einfachen Slash.

Wollt ihr aber das Script nur auf Windows verwenden:
Da braucht man zwei Backlashes (\\) weil der erste dazu da ist, den nachgehenden zu escapen und Windows die Dateipfade mit Backlashes unterteilt.

Aber PHP versteht auch / und übersetzt richtig.

also nehmt einfach / das läuft plattformübergreifend und ist einfacher,ooookaaay ? :)

Deine Rekursive Funktion scheint fast zu funktionieren, doch irgendwo liegt da noch ein kleiner Denkfehler, werds auch mal anschauen

 
cheC
01-12-2005, 13:57 
 
Original geschrieben von pozy

Ich hab hier jetz einige Unklarheiten über die Backlash/Slash Sache gehört...




in anderen Worten


Dir ist es unklar geblieben


stimmt's?

 
chrissie82
12-12-2005, 15:01 
 
Ich muss doch nochmal was hierzu loswerden!!
Ich habe gehört, dass meine Variante nicht sicher ist...
ich möchte ja, dass jeder Benutzer nur auf seinen Verzeichnispfad zugreifen kann und somit nur die für ihn bestimmten Bilder betrachten. Nun habe ich aber gehört, dass es durch direkte Adresseingabe im Browser möglich ist, auch Bilder aus anderen Verzeichnissen zu betrachten... wie kann ich denn so etwas ausschließen??

 
cheC
12-12-2005, 15:27 
 
Mit htpassword - Dateien, die in die Verzeichnisse kopiert werden. Es gibt htaccess und htpassword - zur Kontrolle darüber wer was wo nicht darf oder darf.

In htpassword - Dateien werden die Namen und Passworte derjenigen Benutzer gespeichert, die Zugang zu einem Verzeichnis haben, dieselbe Datei sagt dann zu allen Anderen Besuchern: "Sorry, get nich wat Du hier vorhast", resp etwas realistischer: "Access denied" oder sowas, was dem Server aufgetragen wurde zu antworten. Bei nächstem Klick kommt dann meist eine Antwort - Seite, die alternativ angezeigt wird weil ja das gewünschte Ziel nicht zur verfügung steht und die sagt meistens: "Authorization required".

Wie Du das machst - htpassword - Dateien erstellen und zum Server kopieren?
Dazu gibt es kleine Admin - Scripts, entweder als freeware oder als Teil von Shareware - Angeboten oder in Open Source - Admintools.

Wie Du da dran kommst?
Ein wenig herumsuchen und dann ausprobieren was Dir am besten gefällt, womit Du am besten zurecht kommst.

 
wahsaga
12-12-2005, 15:42 
 
Original geschrieben von cheC
Mit htpassword - Dateien, die in die Verzeichnisse kopiert werden. Es gibt htaccess und htpassword - zur Kontrolle darüber wer was wo nicht darf oder darf.
Diese Antwort ist - für den vorliegenden Fall - vollkommener Quark.
Hier wird durch ein PHP-Script ein Verzeichnis im Dateisystem des Webservers ausgelesen - HTTP ist also gar nicht im Spiel.


Um das "Problem" zu lösen, dass der Benutzer durch Manipulation von Parametern in Verzeichnisse "hineinsehen" kann, die er nicht sehen soll, muss man im PHP-Script selbst überprüfen, ob der Parameter im gültigen Bereich liegt.

 
cheC
12-12-2005, 17:34 
 
Original geschrieben von wahsaga

Diese Antwort ist - für den vorliegenden Fall - vollkommener Quark.




Ich verabschiede mich und wünsche den trauernden Hinterbliebenen noch recht viel Spaß - mit solch' aggressivem und unfreundlichem Umgang.

 
chrissie82
12-12-2005, 20:00 
 
Soweit ich weiß, kann man PHP Scripte in den "geschützten" Bereich stellen. Das habe ich ja auch gemacht... durch mein Loginsystem... somit sind ja eigentlich gar keine direkten Seitenaufrufe möglich, ohne sich vorher einzuloggen.
Die Verzeichnisse, zu denen die User dürfen, stehen in der Datenbank. Ich überprüfe also ob der SessionName dem Datenbank-Usernamen entspricht. Falls ja, wird das Verzeichnis angezeigt.
Nun habe ich aber erfahren, dass Bilder, die im wwwroot-Verzeichnis liegen, trotzdem von anderen Usern einsehbar sind, weil diese direkt aufgerufen werden können... also z.B. mit:
http://localhost/chrissie_20/bild.jpg
Und genau das muss ich irgendwie verhindern.... habe schon gehört das es doch besser ist die Bilder direkt in der Datenbank zu speichern, wegen der Sicherheit.... was meint ihr??

 
pozy
13-12-2005, 11:58 
 
Dieser geschützte Bereich den du meinst kannst du durch .htaccess Dateien erreichen.

Mit denen kann man gewisse Apache Konfigurationswerte für Teile der Homepage ändern.

Es gibt ja die Möglichkeit das mit Passwörter zu schützen mit der zusätzlichen .htpasswd und den nötigen Zeilen in der .htaccess, was man allerdings dort hinschreiben müsste, das niemand auf das Verzeichnis zugreifen kann, weiss ich nicht...

Könnt mir aber vorstellen, es wäre sowas wie:
Deny All

Da PHP nicht über Apache auf die Dateien zugreifft, wie es wahsaga gesagt hat, kann es das Verzeichnis weiterhin auslesen... Das Problem ist aber das du dann nicht Links im Script anzeigen kannst ala http://localhost/chrissie_20/bild.jpg sondern du müsstest über ein php script den inhalt der datei lesen und ausgeben (mit richtigen Header...), dass das nachher etwa so ausschaut:

http://localhost/download.php?bild=bild.jpg

Pass da ja auf :), kann man gut missbrauchen, wenn man nicht vorsichtig ist...
Hint: http://localhost/download.php?bild=/etc/shadow

Die einfachste Möglichkeit wäre es natürlich schon, die Bilder in der DB zu speichern. Die Frage ist ob dann dein Server bei einer gewissen DB-Grösse nicht massiv langsamer wird...

Aber beide Möglichkeiten kann man nicht als sauber betitteln.

 
chrissie82
13-12-2005, 19:52 
 
Na dann sollte ich die Bilder vielleicht doch direkt in der Datenbank speichern. Ich benutze nämlich auch nicht den Apache, sondern den Microsoft Internet Information Server.
Denke nicht das die Datenbank zu "voll" wird, denn nach einem gewissen Zeitraum sollen die Daten wieder gelöscht werden...
Hat vielleicht jemand einen guten Link, wie ich sowas am besten löse?? Habe schonmal ein Script, womit ich die Bilder in die Datenbank hineinschaufele... allerdings noch keines, was diese wieder herausholt...

 
pozy
14-12-2005, 00:20 
 
Wenn du den IIS mit PHP verwendest kann ich dir sowieso nicht mehr weiterhelfen :D

und beim herausholen aus der DB...
das sind SQL Grundbefehle die dafür brauchst.

aber ich kann schlecht verstehen, dass jemand der mit php programmiert nicht weiss wie man das selber tun könnte und sich diese einfachsten scripts schon herunterladen muss...

ich denke du solltest dir vielleicht erst mal ein PHP & MySQL buch reinziehen und losschreiben.

das anzeigen kannst dir bei download-redirect scripts abschauen, da werden teils header gesetzt.


Naja, werd dir trozdem einen kleinen leitfaden geben:
:readthis:

Datei: anzeigen.php?datei=13
1. Richtige Datei anhand mitgegebenen datei variable und gespeicherter Userid aus session, aus der Datenbank ziehen.
2. Dieses Resultat in einer variable speichern (dort sind dann die binären daten des bildes drin)
3. Headers auf den Bildtyp setzen
4. variable ausgeben

Möglicherweise In der Verzeichnisschlaufe des Anzeigescripts sowas:

<img src="anzeigen.php?<?=$bildid;?>" border="0">


hoffe ich konnte dir ein wenig helfen,
gute nacht.


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:06 Uhr.