5.2k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von Einsteiger_in (57 Punkte)
Hey Leute,
ich habe folgendes vor: Ich möchte mit nur einer Datei alle Verzeichnisse auf meinem Webserver auslesen können. Zuerst wird das Hauptverzeichnis ausgelsen, klickt man auf eine Datei wird diese an eine andere PHP-Datei weitergeleitet in welcher ich dann den Inhalt editieren will. Klickt man auf einen Ordner, soll alles dargestellt werden, was in diesem Ordner drin ist. Dateien werden wider an die PHP-Datei zum editieren weitergeleitet und Ordner sollen "geöffnet" werden. Ich hoffe ich versteht was ich mein, falls nicht => Fragen^^

Naja ich hab das ganze soweit schonmal versucht, das Hauptverzeichnis bekomme ich Problemlos dargestellt. Klicke ich dann auf einen Ordner, wird der Inhalt dieses Ordners auch dargestellt, jedoch werden Ordner als Dateien ausgegeben. Wäre cool wenn ihr das Script bei euch einfach mal testen könntet, dann wisst ihr sicher was ich mein.

<?php

$list_ignore = array ('.','..','exemples','phpmyadmin','sqlitemanager');
$handle = opendir(".");
while ($file = readdir ($handle))
{

if(is_dir($file) && !in_array($file, $list_ignore))
{
echo "<a href='?ordner=$file' target=''><img src='ordner.gif'> $file</a><br>\n";
}elseif(!is_dir($file) && !in_array($file, $list_ignore))
{
$pfad = "http://".$_SERVER[SERVER_ADDR].str_replace('index.php', '', $_SERVER[REQUEST_URI]);
echo "<a href='http://$_SERVER[SERVER_ADDR]/.../lesen.php?pfad=$pfad&datei=$file' target=''><img src='datei.jpg' width='12' height='15'> $file</a><br>\n";
}
}

closedir($handle);

?>



Danke euch!

Gruß Jan

9 Antworten

0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Übel übel.
Grundsätzlich falsch war, dass du is_dir() immer nur mit dem Dateinamen abgefragt hast ohne Pfad dazu. Hinzu kam die unnötige Doppelprüfung auf zu verbergen wollende Verzeichniseinträge, sowie die unnötige Nutzung von einfachen statt doppelten Anführungsstrichen in HTML und den entsprechend falsch generierten Links.

Ein funktionierendes Beispiel:
<?php

$aIgnore= array( '.', '..', 'exemples', 'phpmyadmin', 'sqlitemanager' );
$sDir= isset( $_REQUEST['ordner'] )? $_REQUEST['ordner']: '.';

if ( $hDir= opendir( $sDir ) ) {
if ( substr( $sDir, -1, 1 )!= '/' ) $sDir.= '/';

while ( ( $sFile= readdir( $hDir ) )!== false ) {
if ( in_array( $sFile, $aIgnore ) ) continue;

if ( is_dir( $sDir. $sFile ) ) {
echo '<a href="?ordner='. $sDir. $sFile. '"><img src="ordner.gif" alt="Ordner" />'. $sFile. "</a><br>\n";
} else {
echo '<a href="http://'. $_SERVER['SERVER_ADDR']. '/.../lesen.php?datei='. $sDir. $sFile. '"><img src="datei.jpg" alt="Datei" />'. $sFile. "</a><br>\n";
}
}
closedir( $hDir );
} else die( 'opendir() failed' );

?>
0 Punkte
Beantwortet von Einsteiger_in (57 Punkte)
Hey Quatsch :D

Vielen Dank für dein Script, tut einwandfrei =)

Muss es mir nur jetzt mal ordentlich anschaun, damit ichs au kapier!

Gruß Jan
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Frag einfach alles :-)
0 Punkte
Beantwortet von Einsteiger_in (57 Punkte)
hmmm ich habe jetzt noch ein Problem mit der lesen.php-Datei die den Inhalt der übergebenen Datei auslesen und in ein textarea schreiben soll.


<html>
<head>
<title>Datei Bearbeiten</title>
</head>
<body>


<?php


echo "$_GET[pfad]$_GET[datei]<br>";

echo "<br>";

?>


<form action="datei_speichern.php" METHOD="POST">
<textarea name="datei_inhalt" cols="170" rows="45"><?php
$datei = file("$_POST[$pfad]$_GET[datei]");
for($i = 0; $i < count($datei); $i++)
{
echo $datei[$i];
}
?>

</textarea>
<input name="pfad" type="hidden" value="<?php echo $_GET[pfad]; ?>"> <input name="datei" type="hidden" value="<?php echo $_GET[datei]; ?>">

<input type="submit" value="Speichern"><input type="reset" value="L&ouml;schen">
</form>

</body>
</html>




Ich öffne lesen.php die Datei lesen.php (also die gleiche^^ ) Diese Datei hat ausgegeben in der Textarea dann nur noch folgenden Inhalt:

<html>
<head>
<title>Datei Bearbeiten</title>
</head>
<body>


<?php


echo "$_GET[pfad]$_GET[datei]<br>";

echo "<br>";

?>


<form action="datei_speichern.php" METHOD="POST">
<textarea name="datei_inhalt" cols="170" rows="45"><?php
$datei = file("$_POST[$pfad]$_GET[datei]");
for($i = 0; $i < count($datei); $i++)
{
echo $datei[$i];
}
?>


Die Inputs und das </textarea> werden nicht ausgegeben, bzw werden ausgeführt und erstellen dadurch halt den Submit und reset-Button :-(

Ich versteh net warum des net mit angezeigt wird, da HTML-Code oben ja auch nicht ausgeführt sondern ausgegeben wird.

Gruß Jan
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Du machst dieselben Fehler erneut:

Falsch:
$feld[element]


Richtig:
$feld['element']


Warum? Elementnamen sind Texte, also müssen sie in Hochkommata (einfache oder doppelte ist egal).
Warum "funktioniert" es auch ohne? Weil das eigentlich Konstanten sind. PHP ist aber idiotenfreundlich und gibt als Wert für die Konstante ihren eigenen Namen aus - was wiederum einem Text entspricht. Mag oft gut gehen, kann aber auch mal gewaltig daneben gehen.

Folgende Lösung (Datei "lesen.php"):
<?php

// schickt uns wieder zurück zur Ordneransicht
function zurueck() {
$sParam= $_REQUEST['datei'];
$i1= strrpos( $sParam, '/' );
if ( $i1=== false ) $sParam= ''; else $sParam= '?ordner='. substr( $sParam, 0, $i1 );
header( 'Location: http://'. $_SERVER['SERVER_ADDR']. '/dir.php'. $sParam );
exit;
}

// wurde überhaupt ein Dateiname übergeben?
if ( !isset( $_REQUEST['datei'] ) ) die( 'keine Datei angegeben' );

// soll ein Dateiinhalt gespeichert werden?
if ( isset( $_REQUEST['speichern'] ) ) {
if ( file_put_contents( $_REQUEST['datei'], $_REQUEST['inhalt'] )=== false ) die(' konnte Datei nicht schreiben' );
zurueck();
} else
// ...oder wurde die Bearbeitung abgebrochen?
if ( isset( $_REQUEST['zurueck'] ) ) {
zurueck();
// ...ansonsten Datei zum Bearbeiten anzeigen
} else {
// existiert sie überhaupt?
if ( !file_exists( $_REQUEST['datei'] ) ) die( 'Datei existiert nicht' );

// Inhalt lesen und anzeigen
$sFile= file_get_contents( $_REQUEST['datei'] );
echo '<html><head>
<title>Datei bearbeiten</title>
</head><body>Datei: '. $_REQUEST['datei']. '
<form action="'. $_SERVER['REQUEST_URI']. '" method="POST">
<textarea name="inhalt" cols="170" rows="45" style="width: 100%; height: 80%;">'. $sFile. '</textarea>
<input type="hidden" name="datei" value="'. $_REQUEST['datei']. '" />
<input type="submit" name="speichern" value="Speichern" />
<input type="submit" name="zurueck" value="Abbruch" />
</form>
</body></html>';
}

?>

Das funktioniert zwar einwandfrei, aber vor allem sollst du es versuchen zu verstehen.
0 Punkte
Beantwortet von Einsteiger_in (57 Punkte)
Okay, ich muss mir das mit den Hochkommas echt angewöhnen. Ich habs mir irgendwie ohne angewöhnt, da es ja auch ohne Hochkommas ging^^

Ich schaus mir nachher an, hab grad leider keine zeit :-(
Falls ich was net peil bin ich mal so frech und frag einfach nach....

Vielen Dank für deine Hilfe!

Gruß Jan
0 Punkte
Beantwortet von Einsteiger_in (57 Punkte)
Hey,

leider klappt auch deine Lösung nicht. ist genau das gleiche wie bei meiner :-( Wenn ich eine Datei mit nem Button oder nem Textfeld (z. B. die lesen.php) aufrufe werden die Buttons aus dem zu ladenden Quelltext direkt in Buttons umgewandelt und net als Code ausgegeben. Ich versteh echt net warum^^

=> img211.imageshack.us/img211/1636/dateiauslesenphp.png

Gruß Jan
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Jetzt versteh ich überhaupt erst, was du mit "werden ausgeführt" gemeint hast. Oje.
Das hättest du natürlich von vornherein sagen müssen, dass deine zu bearbeitenden Dateien auch selbst HTML enthalten können. Details gefehlt - wie immer. Dieses muss natürlich entsprechend escaped werden, damit es nicht vom Browser interpretiert wird.
Damit ergibt sich folgende Version:

<?php

// schickt uns wieder zurück zur Ordneransicht
function zurueck() {
$sParam= $_REQUEST['datei'];
$i1= strrpos( $sParam, '/' );
if ( $i1=== false ) $sParam= ''; else $sParam= '?ordner='. substr( $sParam, 0, $i1 );
header( 'Location: http://'. $_SERVER['SERVER_ADDR']. '/dir.php'. $sParam );
exit;
}

// wurde überhaupt ein Dateiname übergeben?
if ( !isset( $_REQUEST['datei'] ) ) die( 'keine Datei angegeben' );

// soll ein Dateiinhalt gespeichert werden?
if ( isset( $_REQUEST['speichern'] ) ) {
$sFile= get_magic_quotes_gpc()? stripslashes( $_REQUEST['inhalt'] ): $_REQUEST['inhalt'];
if ( file_put_contents( $_REQUEST['datei'], $sFile )=== false ) die(' konnte Datei nicht schreiben' );
zurueck();
} else
// ...oder wurde die Bearbeitung abgebrochen?
if ( isset( $_REQUEST['zurueck'] ) ) {
zurueck();
// ...ansonsten Datei zum Bearbeiten anzeigen
} else {
// existiert sie überhaupt?
if ( !file_exists( $_REQUEST['datei'] ) ) die( 'Datei existiert nicht' );

// Inhalt lesen und anzeigen
$sFile= htmlentities( file_get_contents( $_REQUEST['datei'] ) );
echo '<html><head>
<title>Datei bearbeiten</title>
</head><body>Datei: '. $_REQUEST['datei']. '
<form action="'. $_SERVER['REQUEST_URI']. '" method="POST">
<textarea name="inhalt" cols="170" rows="45" style="width: 100%; height: 80%;">'. $sFile. '</textarea>
<input type="hidden" name="datei" value="'. $_REQUEST['datei']. '" />
<input type="submit" name="speichern" value="Speichern" />
<input type="submit" name="zurueck" value="Abbruch" />
</form>
</body></html>';
}

?>
0 Punkte
Beantwortet von Einsteiger_in (57 Punkte)
Hey,

okay sorry, hab mich wohl net deutlich genug ausgedrückt.... ^^

Aber ich hatte das gleiche Problem auch mit der PHP Funktion show_source(). Aber nur dann wenn ich show_source() in einer Textarea angewandt habe. Wenn ich es einfach so direkt ausgegeben habe, wurde HTML nicht "ausgeführt" sondern der Code ausgeschrieben. Das ist echt recht merkwürdig.

Jetzt tuts ja, auch wenn ich das Script nemme so wirklich peil. Ich schaus mir jetzt aber erst mal an.

Vielen Dank!

Gruß Jan
...