Problem mit fopen() - Inhalt der Datei wird gelöscht!

CyberSeb

Grünschnabel
Hallo zusammen,
ich habe ein relativ schwerwiegendes Problem mit der Funktion fopen().
Die Idee ist, dass ich sozusagen ein kleines Admininterface zum Dateien abändern (txt) habe, um nicht immer im HTML-Code rumfummeln zu müssen, um Inhalte zu editieren.

Soweit so gut. Ich binde also die jeweilige TXT-Datei per

<?php
$fp = fopen("txt/home/home_2.txt","r");
if ($fp)
{
while(!feof($fp))
{
$text = fgets($fp);
echo"$text";
}
fclose($fp);
}
?>

ein und bearbeite diese im Adminbereich über eine Textarea mit einem Formular, das folgenden Code ausführt:

<?php
$text = $HTTP_POST_VARS["text"];
$datei = fopen("../../txt/home/home_1.txt", "w");
fwrite ($datei, $text);
fclose ($datei);
echo "Der eingegebene Text wurde erfolgreich eingetragen";
?>

Jetzt ist das Problem jedoch, dass das anfangs ohne Probleme lief (Server ist ein Shared Hosting Paket von goneo mit PHP5; habe das selbe Problem aber auch auf meinem Root-Server mit Fedora Core 7 und PHP5!), aber inzwischen (ich kann mich leider nicht daran erinnern, was ich geändert habe) nicht mehr funktioniert. Möchte ich eine Datei ändern und klicke auf Speichern, wird einfach der Inhalt der txt-Datei gelöscht (nicht die eigentliche Datei, nur der Inhalt!). Lokal (WAMPP) funktioniert das alles ohne Probleme.

Und ja: Ich habe CHMOD auf 777 - wie gesagt, anfangs gings ja auch.

Deshalb meine Frage: Ist in diesen Scripts irgwo ein grundlegender Fehler? Oder woran sonst könnte das liegen? Bin kurz vorm Verzweifeln!

Danke im Voraus.
Mit freundlichen Grüßen,
CyberSeb
 
Deshalb meine Frage: Ist in diesen Scripts irgwo ein grundlegender Fehler? Oder woran sonst könnte das liegen? Bin kurz vorm Verzweifeln!

Jo, aber nur ein kleiner :-)
php-Handbuch hat gesagt.:
'w' - Öffnet die Datei nur zum Schreiben und setzt den Dateizeiger auf den Anfang der Datei sowie die Länge der Datei auf 0 Byte. Wenn die Datei nicht existiert wird versucht sie anzulegen.

'a' - Öffnet die Datei nur zum Schreiben. Positioniert den Dateizeiger auf das Ende der Datei. Wenn die Datei nicht existiert, wird versucht sie anzulegen.
Du öffnest die Datei mit dem Parameter "w"...da wird ihr Inhalt gelöscht.
Nehme Parameter "a"(a steht für appending->anhängend)
 
Hallo,

danke für die Antwort! Jetzt stellen sich mir nur 2 Fragen:

1. Warum wird denn nun der Inhalt der Datei auf einmal gelöscht, wenn es davor ohne Probleme ging?
2. Mit Append werden Datensätze ja nur angehängt - was wenn ich aber eine Datei editieren möchte?

Danke und Grüße,
CyberSeb
 
  1. Ich bezweifle, dass es mit dem w vorher ohne Probleme ging
    ich kann mich leider nicht daran erinnern, was ich geändert habe
    ...vielleicht war es ja das, was du geändert hattest :-)
  2. Dann musst du den Dateiinhalt erst in eine Variable lesen, diese Variable ändern und dann wieder komplett in die Datei schreiben(mit "w")
 
Hallo,

danke für die Antwort, werde es gleich auf dem Server ausprobieren - wie gesagt, lokal bei meinem WAMPP-System geht das mit "w" ohne Probleme...
Kannst du mir vielleicht bitte grad das Script entsprechend abändern? Also mit der Variable, habe selbst nicht wirklich 'ne Ahnung von PHP.. Wäre nett.

Grüße,
Seb
 
Hallo,

wenn ich das richtig verstanden habe, soll der Inhalt der Datei ja quasi überschrieben werden, daher denke ich das "w" korrekt ist.

Was mir bei deinem Code aufgefallen ist, ist das du mit dem alten "$HTTP_POST_VARS" arbeitest. Diese stehen zwar nich zur Verfügung aber das PHP Manual sagt dazu
$_POST
Variablen, die dem Skript über HTTP POST geliefert werden. Entspricht dem alten $HTTP_POST_VARS-Array, das zwar noch zur Verfügung steht, aber abzulehnen ist.

Weiter wird dazu gesagt, das $_POST eine automatische "superglobale" Variable ist, $HTTP_POST_VARS aber nicht automatisch superglobal.
Vielleicht arbeitest du in einer Funktion und dann wäre diese nicht superglobale Variable in der Funktion nicht sichtbar, der Inhalt dann null und diesen Inhalt schreibst du ins Textfile.

Ich würde erstmal etwas debugging versuchen.
Was steht in $text (echo $text) Ansonsten versuche mal $HTTP_POST_VARS durch $_POST zu ersetzen.

PHP:
<?php
$text = $HTTP_POST_VARS["text"];
var_dump($text); /// Testausgabe
$text = $_POST["text"];
var_dump($text);
$datei = fopen("../../txt/home/home_1.txt", "w");
fwrite ($datei, $text);
fclose ($datei);
echo "Der eingegebene Text wurde erfolgreich eingetragen";
?>

Ursache vielleicht ein Update der PHP Versionen? Früher nur mit PHP4 gearbeitet oder sowas

Gruss
 
Kannst du mir vielleicht bitte grad das Script entsprechend abändern? Also mit der Variable, habe selbst nicht wirklich 'ne Ahnung von PHP.. Wäre nett.
PHP:
<?php
$text = file_get_contents('txt/home/home_2.txt');

//Hier irgendwo müsstest du $text verändern

$datei = fopen("../../txt/home/home_1.txt", "a");
fwrite ($datei, $text);
fclose ($datei);
echo "Der eingegebene Text wurde erfolgreich eingetragen";
?>
 
Ursache vielleicht ein Update der PHP Versionen? Früher nur mit PHP4 gearbeitet oder sowas

Ich glaub's nicht, es geht! Ursache muss wohl tatsächlich an den PHP-Versionen gelegen haben. Auf dem Root-Server läuft PHP5, da hat's gar nicht gefunkt. Auf dem Hosting Paket lief alles, bis ich eine htaccess hochgeladen habe, die PHP5 als CGI-Modul verwenden soll.
Mit der $_POST-Methode geht alles ohne Probleme!

Vielen Dank - auch für die anderen Antworten!

PS: Ein Rätsel bleibt aber immer nur: Warum klappt das ganze auf einem WAMPP-System mit PHP5 ohne Probleme? :))
 
Zurück