Speichern von Einträgen in Textdatei klappt nicht wie vorgesehen
Enrico
- php
Hallo,
leider muß ich euch noch einmal mit einem Problem im Umgang mit Textdateien bemühen, jetzt mit dem Abspeichern von Inhalten.
An dieser Stelle muß ich mich für die Länge meiner Problemschilderung entschuldigen, aber kürzer wollte ich sie nicht formulieren, damit (hoffentlich) auch alles nachvollziehbar ist.
Hier zunächst der betroffene Code, die Problemschilderung folgt anschliessend:
$Datei = '../Textdateien/Gaestebuch__Eintraege.txt';
list ($Zeilen, $Meldung) = @Datei_einlesen ($Datei);
if ($Meldung === "Kein Inhalt")
{
$Inhalt = "1|#|" . $Name . "|#|" . $eMail . "|#|" . $Homepage . "|#|" . $Nachricht . "|#|" . $Datum . "|#|" . $Uhrzeit . "|#|" . $IP . "|#|" . $Token . "|#|" . $Status;
}
else
{
if ($Meldung !== "Kein Fehler")
{
echo $Meldung;
// Header ("Location: Meldungen_NEU.php?Meldung=" . $Meldung);
}
else
{
$Nr = count ($Zeilen) + 1;
$Eintrag = $Nr . "|#|" . $Name . "|#|" . $eMail . "|#|" . $Homepage . "|#|" . $Nachricht . "|#|" . $Datum . "|#|" . $Uhrzeit . "|#|" . $IP . "|#|" . $Token . "|#|" . $Status;
array_push ($Zeilen, $Eintrag);
rsort ($Zeilen, SORT_NUMERIC);
$Inhalt = implode ("[ENDE]", $Zeilen);
}
}
$Meldung = @Datei_speichern ($Datei, $Inhalt);
if ($Meldung !== "Kein Fehler")
{
echo $Meldung;
// Header ("Location: Meldungen_NEU.php?Meldung=" . $Meldung);
}
Eben genannter Code ist das Gerüst zum Speichern neuer Einträge.
Hier die zugehörigen Funktionen:
function Datei_einlesen ($Datei)
{
global $Meldung;
$Dateiname = @basename ($Datei);
if (!file_exists ($Datei))
{
$Meldung = 'Ausrufezeichen|Die Datei "' . $Dateiname . '" konnte nicht gefunden werden oder die Pfadangabe zur Datei ist falsch.<br><br>Bitte schicke uns eine kurze Mitteilung mit einer Fehlerbeschreibung. Wir werden uns bemühen, den Fehler umgehend zu beheben.<br><br>Vielen Dank im Voraus und trotzdem weiterhin viel Spaß auf unserer Homepage.|OK|VorherigeSeite';
}
else
{
echo 'Funktion "Datei_einlesen": Datei "' . $Dateiname . '" besteht<br>';
if (filesize ($Datei) === 0)
{
return array ('', 'Kein Inhalt');
}
else
{
echo 'Funktion "Datei_einlesen": Datei "' . $Dateiname . '" ist ' . filesize ($Datei) . ' Bytes groß<br>';
if (!is_readable ($Datei))
{
return array ('', 'Ausrufezeichen|Die Datei "' . $Dateiname . '" wurde als nicht lesbar zurückgemeldet.<br><br>Bitte schicke uns eine kurze Mitteilung mit einer Fehlerbeschreibung. Wir werden uns bemühen, den Fehler umgehend zu beheben.<br><br>Vielen Dank im Voraus und trotzdem weiterhin viel Spaß auf unserer Homepage.|OK|VorherigeSeite');
}
else
{
echo 'Funktion "Datei_einlesen": Datei "' . $Dateiname . '" ist lesbar<br>';
if (!$Zeiger = fopen ($Datei, "rb"))
{
return array ('', 'Ausrufezeichen|Die Datei "' . $Dateiname . '" konnte nicht zum Lesen geöffnet werden.<br><br>Bitte schicke uns eine kurze Mitteilung mit einer Fehlerbeschreibung. Wir werden uns bemühen, den Fehler umgehend zu beheben.<br><br>Vielen Dank im Voraus und trotzdem weiterhin viel Spaß auf unserer Homepage.|OK|VorherigeSeite');
}
else
{
echo 'Funktion "Datei_einlesen": Datei "' . $Dateiname . '" konnte zum Lesen geöffnet werden<br>';
if ($Inhalt = @fread ($Zeiger, filesize ($Datei)) === FALSE)
{
return array ('', 'Ausrufezeichen|Der Inhalt der Datei "' . $Dateiname . '" konnte nicht eingelesen werden.<br><br>Bitte schicke uns eine kurze Mitteilung mit einer Fehlerbeschreibung. Wir werden uns bemühen, den Fehler umgehend zu beheben.<br><br>Vielen Dank im Voraus und trotzdem weiterhin viel Spaß auf unserer Homepage.|OK|VorherigeSeite');
}
else
{
echo 'Funktion "Datei_einlesen": Datei "' . $Dateiname . '" konnte eingelesen werden<br>';
fclose ($Zeiger);
$Zeilen = explode ("[ENDE]", $Inhalt);
return array ($Zeilen, 'Kein Fehler');
}
}
}
}
}
}
function Datei_speichern ($Datei, $Inhalt)
{
global $Meldung;
$Dateiname = @basename ($Datei);
if (!file_exists ($Datei))
{
return 'Ausrufezeichen|Die Datei "' . $Dateiname . '" konnte nicht gefunden werden oder die Pfadangabe zur Datei ist falsch.<br><br>Bitte schicke uns eine kurze Mitteilung mit einer Fehlerbeschreibung. Wir werden uns bemühen, den Fehler umgehend zu beheben.<br><br>Vielen Dank im Voraus und trotzdem weiterhin viel Spaß auf unserer Homepage.|OK|VorherigeSeite';
}
else
{
echo 'Funktion "Datei_speichern": Datei "' . $Dateiname . '" besteht<br>';
if (!is_writable ($Datei))
{
return 'Ausrufezeichen|Die Datei "' . $Dateiname . '" wurde als nicht schreibbar zurückgemeldet.<br><br>Bitte schicke uns eine kurze Mitteilung mit einer Fehlerbeschreibung. Wir werden uns bemühen, den Fehler umgehend zu beheben.<br><br>Vielen Dank im Voraus und trotzdem weiterhin viel Spaß auf unserer Homepage.|OK|VorherigeSeite';
}
else
{
echo 'Funktion "Datei_speichern": Datei "' . $Dateiname . '" ist schreibbar<br>';
if (!$Zeiger = fopen ($Datei, "wb"))
{
return 'Ausrufezeichen|Die Datei "' . $Dateiname . '" konnte nicht zum Schreiben geöffnet werden.<br><br>Bitte schicke uns eine kurze Mitteilung mit einer Fehlerbeschreibung. Wir werden uns bemühen, den Fehler umgehend zu beheben.<br><br>Vielen Dank im Voraus und trotzdem weiterhin viel Spaß auf unserer Homepage.|OK|VorherigeSeite';
}
else
{
echo 'Funktion "Datei_speichern": Datei "' . $Dateiname . '" konnte zum Schreiben geöffnet werden<br>';
if (@fwrite ($Zeiger, $Inhalt) === FALSE)
{
return 'Ausrufezeichen|Der Inhalt der Datei "' . $Dateiname . '" konnte nicht geschrieben werden.<br><br>Bitte schicke uns eine kurze Mitteilung mit einer Fehlerbeschreibung. Wir werden uns bemühen, den Fehler umgehend zu beheben.<br><br>Vielen Dank im Voraus und trotzdem weiterhin viel Spaß auf unserer Homepage.|OK|VorherigeSeite';
}
else
{
echo 'Funktion "Datei_speichern": Datei "' . $Dateiname . '" konnte geschrieben werden<br>';
fclose ($Zeiger);
return 'Kein Fehler';
}
}
}
}
}
Ich habe deswegen "echo"-Befehle eingebaut, um überprüfen zu können, ob und wenn ja, an welcher Stelle etwaige Fehler aufgetreten sind. Auch habe ich die Abfrage, ob die Datei besteht und schreibbar ist, bewusst auf zwei Abfragen aufgeteilt, da es theoretisch ja auch sein kann, dass sie besteht, aber eben nicht beschrieben werden kann (aus welchen Gründen auch immer).
Wenn ich nun meine Seite zum ersten Mal aufrufe (die Textdatei hat zu diesem Zeitpunkt - zu Testzwecken - noch keinen Inhalt), dann erzeugen mir die Funktionen folgende Bildschirmausgabe:
Funktion "Datei_einlesen": Datei "Gaestebuch__Eintraege.txt" besteht Funktion "Datei_speichern": Datei "Gaestebuch__Eintraege.txt" besteht Funktion "Datei_speichern": Datei "Gaestebuch__Eintraege.txt" ist schreibbar Funktion "Datei_speichern": Datei "Gaestebuch__Eintraege.txt" konnte zum Schreiben geöffnet werden Funktion "Datei_speichern": Datei "Gaestebuch__Eintraege.txt" konnte geschrieben werden
Die Textdatei wird mit folgendem Inhalt belegt:
1|#|Enrico|#||#||#|Dies ist nur ein Test|#|13.11.2011|#|16:14:34|#|::1|#|3bf953c8c30070949175d0c86e8ad044|#|0
Beim zweiten Aufrufen der Seite durch Reload der Seite habe ich folgende Bildschirmausgabe:
Funktion "Datei_einlesen": Datei "Gaestebuch__Eintraege.txt" besteht Funktion "Datei_einlesen": Datei "Gaestebuch__Eintraege.txt" ist 126 Bytes groß Funktion "Datei_einlesen": Datei "Gaestebuch__Eintraege.txt" ist lesbar Funktion "Datei_einlesen": Datei "Gaestebuch__Eintraege.txt" konnte zum Lesen geöffnet werden Funktion "Datei_einlesen": Datei "Gaestebuch__Eintraege.txt" konnte eingelesen werden Funktion "Datei_speichern": Datei "Gaestebuch__Eintraege.txt" besteht Funktion "Datei_speichern": Datei "Gaestebuch__Eintraege.txt" ist schreibbar Funktion "Datei_speichern": Datei "Gaestebuch__Eintraege.txt" konnte zum Schreiben geöffnet werden Funktion "Datei_speichern": Datei "Gaestebuch__Eintraege.txt" konnte geschrieben werden
Die Textdatei hat nun folgenden Inhalt: 2|#|Enrico|#||#||#|Dies ist nur ein Test|#|13.11.2011|#|16:22:22|#|::1|#|618a560c0856202595234bdd0a01b4ba|#|1[ENDE]
Hier fällt mir auf, dass der Inhalt der Textdatei vom neuen Eintrag nur komplett überschrieben, der neue Eintrag vor dem Speichern aber nicht an den bestehenden Inhalt angehängt wird, das vollständige Neuschreiben der Datei ist beabsichtigt. Zum anderen habe ich das Kennzeichen "[ENDE]" am Ende des neuen Eintrages, was so auch richtig wäre, wenn ich danach den ersten Eintrag in der Datei hätte.
Bei jedem weiteren Reload der Seite bekomme ich folgende Bildschirmausgabe, die sich auch nicht mehr ändert:
Funktion "Datei_einlesen": Datei "Gaestebuch__Eintraege.txt" besteht Funktion "Datei_einlesen": Datei "Gaestebuch__Eintraege.txt" ist 132 Bytes groß Funktion "Datei_einlesen": Datei "Gaestebuch__Eintraege.txt" ist lesbar Funktion "Datei_einlesen": Datei "Gaestebuch__Eintraege.txt" konnte zum Lesen geöffnet werden Funktion "Datei_einlesen": Datei "Gaestebuch__Eintraege.txt" konnte eingelesen werden Funktion "Datei_speichern": Datei "Gaestebuch__Eintraege.txt" besteht Funktion "Datei_speichern": Datei "Gaestebuch__Eintraege.txt" ist schreibbar Funktion "Datei_speichern": Datei "Gaestebuch__Eintraege.txt" konnte zum Schreiben geöffnet werden Funktion "Datei_speichern": Datei "Gaestebuch__Eintraege.txt" konnte geschrieben werden
Der Inhalt der Textdatei ändert sich lediglich bezüglich der abgespeicherten Uhrzeit und des Token, d.h. die "Datensatz"-Nummer bleibt immer bei "2".
Wie muß ich mein Gerüst korrigieren, damit in der Textdatei die Einträge korrekt abgelegt werden?
Ich möchte folgende Struktur reinbekommen:
-Kein Eintrag vorhanden: Es wird lediglich der Eintrag ohne Kennzeichen "[ENDE]" abgespeichert -Jeder weitere Eintrag soll dem bestehenden Inhalt vorangestellt werden, nun aber inklusive des Kennzeichens "[ENDE]"
Ich denke, dass es (möglicherweise) nur eine Kleinigkeit ist, aber ich komme einfach nicht darauf.
Vielen Dank für die Zeit, die ihr für das Lesen meiner Problemschilderung aufwenden musstet und eure Mithilfe.
Gruß Enrico
Hi,
leider muß ich euch noch einmal mit einem Problem im Umgang mit Textdateien bemühen, jetzt mit dem Abspeichern von Inhalten.
Warum denn bitte nicht sowas wie SQLite?
Wieso machst du dir das Leben so unnötig schwer?
An dieser Stelle muß ich mich für die Länge meiner Problemschilderung entschuldigen, aber kürzer wollte ich sie nicht formulieren, damit (hoffentlich) auch alles nachvollziehbar ist.
Die Arbeit, das Problem einzugrenzen, wälzt du also lieber auf uns ab – anstatt das selber zu machen, obwohl es eigentlich deine Aufgabe wäre.
Ich möchte folgende Struktur reinbekommen:
-Kein Eintrag vorhanden: Es wird lediglich der Eintrag ohne Kennzeichen "[ENDE]" abgespeichert
Wozu?
Warum willst du Daten speichern, wenn es keine Daten gibt?
-Jeder weitere Eintrag soll dem bestehenden Inhalt vorangestellt werden, nun aber inklusive des Kennzeichens "[ENDE]"
Warum nutzt du denn, wenn du dich einer SQL-Lösung schon so hartnäckig verweigerst, nicht *wenigstens* die CSV-Funktionen, die dir im anderen Thread schon nahegelegt wurden? Warum willst du auf Teufel komm raus etwas eigenes basteln, wenn du auf die Schwachpunkte dieser deiner Vorgehensweise schon explizit hingewiesen wurdest?
MfG ChrisB
Hi,
leider muß ich euch noch einmal mit einem Problem im Umgang mit Textdateien bemühen, jetzt mit dem Abspeichern von Inhalten.
aber auch für dich gilt, dass Doppelpostings bzw. mehrere Threads zum gleichen Thema/Projekt nicht sinnvoll und daher unerwünscht sind. Bitte bleib in deinem Thread von gestern.
Ciao,
Martin