1.3k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Hallo,

eventuell ist meiner Überschrift etwas ungeschickt formuliert. Ich
wusste aber nicht wie ich mein Problem kurz beschreiben kann.
Es sieht wie folgt aus:

Ich habe 2 Formulare, eins mit einem DropDown Menü in welchem
alle .html Dateien in einem Verzeichnis aufgelistet werden, welche
man dann dort auswählen kann, damit diese in einen Editor
(TinyMCE) genauer gesagt in eine Textarea geladen werden.
Wenn dort Änderungen vorgenommen werden will ich das man
diese in die selbe Datei speichern kann.
Sieht folgendermaßen aus:

Formular 1:

<form method="post" action="#">
<select name="choose" size="1" id="choose">
<?php
if ($handle = opendir('../ordner)) {
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != "..")
if(strrchr($file,".html")) {

echo "<option>$file</option>";

}
}
closedir($handle);

}
?>
</select>
<input type="submit" name="laden" value="Laden" />
</form>


Script zum Öffnen der ausgewählten Datei:



<?
if (isset($_POST['laden']))
{
$select_field = $_POST['choose'];
echo $select_field;
$fp = fopen ($select_field, "r");
$txt = fread ($fp, filesize ($select_field));
fclose ($fp);
}
?>


Formular 2 mit der Textarea und dem Script zum Speichern:

<form method="post" action="#">
<p>
<textarea name="content" cols="100" rows="35"><?php echo
$txt; ?></textarea>
</p>
<p>
<input type="submit" name="save" value="Speichern" />
</p>
</form>
<?

if(isset($_POST['save'])) {
$inhalt = $_POST['content'];
$data = fopen($select_field,"a+");
fwrite($data,$inhalt);
fclose($data);
}


?>


So nun kommt die Fehlermeldung:
"Warning: fwrite(): supplied argument is not a valid stream resource"

Ich denke das liegt daran, dass die Variable $select_field nichtmehr
definiert ist und somit der Dateiname "verloren" geht.
Hat jemand vielleicht einen Lösungsansatz wie man diesen
Dateinamen dort trotzdem nochmal verwenden kann, oder liegts
eventuell an was ganz anderem?
Vielen Dank!

4 Antworten

0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
In dein zweites Formular muss außerdem noch rein
<input name="dateiname" type="hidden" value="<?php echo
$select_field; ?>" />


Und den Erhalt des Dateinamens würd ich im Skript generell machen, statt nur für das laden - also statt
<?
if (isset($_POST['laden']))
{
$select_field = $_POST['choose'];
echo $select_field;

...lieber
<?
$select_field = $_POST['choose'];
if (isset($_POST['laden']))
{
echo $select_field;

...dann ist das auch später gesetzt, falls Formular 2 abgeschickt wurde.

Bleibt noch zu erwähnen, dass es mehr als riskant ist einen Dateinamen samt Pfad von außerhalb ungeprüft anzunehmen. Stell dir vor ich ändere den Namen der zu schreibenden Datei in "C:\boot.ini".
0 Punkte
Beantwortet von
Hallo,

danke erstmal für die Antwort - ich habs jetzt anders gelöst, indem das Formular erst mit echo ausgegeben wird , wenn isset($_POST['laden']) erfolgt ist und dann auch wie du erwähnt hast mit einem hidden feld die Variable übergeben.

Wie könnte denn eine sinnvolle Überprüfung aussehen? Generell sollen nur Dateien aus dem selben Verzeichnis mit einer Endung von .html geladen werden.

MFG
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Na, indem du z.B. prüfst, ob ein Pfad mit drin ist:
$datei= $_POST['laden'];
if( !preg_match( '#^[^/\\\\]+\.html$#i', $datei ) {
die 'Dateiname ungültig! Darf keine Slashes oder Backslahes enthalten!';
}


Und später kannst du prüfen, ob die zu speichernde Datei überhaupt schon existiert:
if( !is_file( 'ordner/'. $datei ) ) {
die 'Datei existiert noch gar nicht, muss aber!';
}
0 Punkte
Beantwortet von
Danke dir!
...