Tom: etwas speichern ohne das alter inhalt gelöscht wird

Beitrag lesen

Hello,

das habe ich schon o.k wenn ich stadt w ein a nehme dan löscht er den alten inhalt nicht aber er schreibt den neuen auch nicht darunter sondern dran ich möchte aber das der neue inhalt immer in einer eigenen zeile steht, geht das?

Genau darauf wollte ich Dich hinweisen.

Mach Dir genaue Gedanken über die Daten und wie Du im Folgenden mit ihnen umzugehen gedenkst. Normalerweise kommt man irgendwann bei Flatfiles zu folgendem Punt:

Bit -> Zeichen -> Wort -> Feld -> Satz -> Datei

Soll heißen, dass in einer Datei Datensätze existieren, die wiederum aus Feldern bestehen, in denen durchaus mehrere Worte stehen können. Beispiel wäre eine Textarea. Ihr Inhalt bildet eine Substruktur innerhalb des Satzes, und das macht Die irgendwann Probleme bei den in PHP üblichen Textdateien. Bei PHP haben die Datensätze alle variable Satzlänge und auch die Felder eine variable Feldlänge. Abgeschlossen wird ein Satz i.d.R durch das Zeilenende-Zeichen (das kann \n, \r, oder \r\n sein).

PHP speichert grundsätzlich in menschlich lesbaren ASCII-Zeichen, d.h., dass Zahlen nicht in der Binärdarstellung sondern in der Dezimaldartstellung gespeichert werden. Es treten also im normalen Zeichenvorrat des Datensatzes keine Sonderzeichen auf. Diesen Umstand können wir nutzen, indem wir die Felder innerhalb eines Satzes mit dem chr(4) oder mit dem chr(9) (TAB) trennen und harte Zeilenumbrüche innerhalb einer Substruktur (Inhalt der Textarea) z.B. mit chr(127) markieren.

Fassen wir zusammen:
Den Datensatz schließen wir mit CRLF ab.
Einen Datensatz bilden wir aus mehreren Feldern.
  Die Felder trennen wir mit #004
Die Zeilenumbrüche der Substruktur "Text" trennen wir mit #127.

Textvorbereitung:
$text = str_replace("\r\n",chr(127),$text);
$text = str_replace("\r",chr(127),$text);
$text = str_replace("\n",chr(127),$text);
Alle drei Ersetzungen durchführen in dieser Reihenfolge. Kann man auch mittels Array machen:

$_crlf=array("\r\n","\r","\n");
$text = str_replace($_crlf,chr(127),$text);

Zusammenbauen des Datensatzes:

define("RET",chr(127));
define("SEP",chr(4));
define("LF",chr(10));

0          1           2         3
$rec = $feld1.SEP.$feld2.SEP.$feld3.SEP.$text.LF;

Nun kann man den Datensatz als geschlossene Einheit "wegschreiben".

Das geht dann einfach mit fwrite($filehandle,$rec,strlen($rec)),
wobei beim die Länge weggelassen werden kann, wenn der ganze Satz weggeschrieben werden soll. Und das wollen wir ja hier.

Die Datensätze stehen dann alle hintereinander wie an einem Bindfaden
in der Datei.

rec(20)LFrec(40)LFrec100LFrec(20)LF

Wenn man den Datensätz n (Datensätze zählt man von 1) wiederhaben will, muss man also (n-1) Satzendezeichen suchen und zählen und dann von dort aus bis zum nächsten LF weiterlesen.

Da das sehr unökononisch sit, Dateien byteweise zu lesen und wir heute über genügend Hauptspeicher für alle "Normalanwendungen" verfügen, liest man einfach die gesamte Datei ein und trennt die Sätze bereits beim lesen in einzelne Records wieder auf:

$_datei = file("dateiname");

$_datei ist dann ein indiziertes Array. In jedem Element steht jetzt ein Datensatz. Das Array fängt jedoch bei 0 an zu zählen!

Wenn man nun die einzelnen Felder z.B. des Datensatzes Nr.4 wiederhaben will, muss man diesen erst wieder zerlegen:

$rec4 = rtrim($_datei[3]);    ## Durch rtrim() wird das LF abgeschnitten
                              ## es gehört ja nicht zu den Daten

$_fields = explode(SEP,$rec); ## Durch explode wird der Datensatz in
                              ## seine Felder zerlegt

$text = str_replace(RET,LF,$_fields[3]); ## Umbrüche wiederherstellen

Wenn man $text jetzt im HTML auseben will, dann schreibt man

echo nl2br(htmlentities($text));

Wenn man es in einer Textarea wieder ausgeben will, dann schreibet man

<textarea name="data[text]" ...><?php echo htmlentities($text) ?></textarea>

Ich hoffe, dass Dir damit ein Stück weiter kommst.

Liebe Grüße aus http://www.braunschweig.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen