Probier mal bitte das testskript
PHP-Code:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
function writeline($s) {
echo $s, "<br />\n";
}
$basedir = 'php.de Testverzeichnis';
if(!is_dir($basedir)) {
writeline('Verzeichnis '.htmlentities($basedir).' existiert nicht und wird nun angelegt');
if (!mkdir($basedir)) {
writeline('mkdir() fehlgeschlagen');
exit;
}
writeline('Verzeichnis angelegt. realpath: '.realpath($basedir));
writeline('Testdateien werden erzeugt');
for($i=0; $i<5; $i++) {
file_put_contents($basedir.'/test '.$i.'.html', '<h1>'.$i.'</h1>');
// Fehlerbehandlung spare ich mir hier. Es ist nur ein Testskript
}
}
if (isset($_GET['file'])) {
/*
Das ist komplett unsicher
auf diese Art kann jede Datei auf dem Server ausgelesen werden,
für der Account des Webserver/PHP-Prozesses Leserechte hat.
Nur für dieses Testskript
*/
if (file_exists($_GET['file'])) {
echo '<fieldset><legend>Inhalt der Datei ', htmlentities($_GET['file']), '</legend>';
readfile($_GET['file']);
echo '</fieldset>';
}
}
echo '<form method="get" action="?"><select name="file">';
foreach(glob($basedir.'/*.html') as $f) {
echo '<option>',htmlentities($f), '</option>';
}
echo '</select><input type="submit" /></form>';
aus.
Es legt ein Verzeichnis mit dem Namen "php.de Testverzeichnis" an, legt fünf Dateien darin ab und zeigt ein <select> mit den Dateinamen an. Wenn man das Formular abschickt, wird der Inhalt einer der Dateien angezeigt.
Daran ändert sich auch nichts, wenn man MySQL dazwischen schaltet. Es sei denn, man ändert durch falsche Codierung die "Nutzlast" der Zeichenkette.
Natürlich kann es Schwierigkeiten mit dem Dateisystem und den zur Verfügung stehenden Funktionen geben. Zum Beispiel kann NTFS zwischen Groß- und Kleinschreibung unterscheiden, aber häufig genutzte Funktionen (auch im Windows Explorer) unterscheiden da nicht. Oder Funktionen sind fest an eine Codepage geknüpft und bilden daher bestimmte Zeichen falsch (oder zumindest anders) ab. usw. Aber Leerzeichen fallen nicht in diese Kategorie.