etwas speichern ohne das alter inhalt gelöscht wird
daniel
- php
HI ich habe eine frage wenn ich eine datei öffne (
$fp = fopen ("datei.txt","w");
fwrite($fp,$irgendwas,10);
fclose($fp);
)
und etwas abspeicher dann lösche ich damit den alten inhalt, was muss ich machen damit der neue inhalt unter den alten steht also wenn ich jetzt immer namen speichere dann so:
Alex
Markus <--- so soll alles in der datei gespeichert werden
Christian
.
.
.
Hi,
$fp = fopen ("datei.txt","w");
vielleicht siehst Du Dir in der Doku http://de2.php.net/manual/de/function.fopen.php mal die "Liste von möglichen Modi für fopen()" an...
HTH Robert
Hi,
$fp = fopen ("datei.txt","w");
vielleicht siehst Du Dir in der Doku http://de2.php.net/manual/de/function.fopen.php mal die "Liste von möglichen Modi für fopen()" an...
HTH Robert
hi robert,
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?
Hi,
das habe ich schon
bono, bono!
[...] 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?
Das geht! Schau mal in der Doku nach, was man mit Strings so alles machen kann, etwa http://de.php.net/manual/de/language.types.string.php
HTH Robert
Hallo,
ich finde da nichts was mir weiter helfen könnt, was meinst du?
Hi,
Du willst mich tatsächlich dazu bringen, Dir einen fertigen Quellcode zu liefern!?
ich finde da nichts was mir weiter helfen könnt, was meinst du?
Ich meine die Steuerzeichen innerhalb von doppelten Anführungszeichen (Double quotes).
HTH Robert
hi,
ich will das du mir so hilfst das ich es verstehe, in der tabelle ist /n mit den ich in die nächste zeile komme, gut , aber was bringt mir das in meinen fall? auf was willst du hinaus? ich habe erst for 3 tagen mit php angefangen und kenne mich damit allgemein noch nicht so gut aus...
Hi!
Jesus, ich ringe um meine Contenance...
ich will das du mir so hilfst das ich es verstehe,
D'accord - das will ich auch!
in der tabelle ist /n mit den ich in die nächste zeile komme, gut ,
Ist /n ein Tippfehler? In der Tabelle steht was von \n...
aber was bringt mir das in meinen fall? auf was willst du hinaus?
Da klopfe ich mir selbst auf die Schulter für meine dechiffrierende Meisterleistung. Aus Deinem atemlosen Konstrukt:
"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?"
überhaupt eine Information herauszufiltern zu können, ist doch wohl klasse - oder? lernt ihr heute in schule so schreiben was meinen tut ohne grosse oder kleine buchstaben oder satze zeichen oder wie oder was keine grammatik nix geht aba schneller zu simsen in handy, weist du net?
Sollte ich Dein Problem richtig verstanden haben, so möchtest Du die Ergänzungen, die Du mit frwite() der Textdatei anfügst, durch einen Zeilenvorschub vom vorhergehenden Inhalt abtrennen. Was steht in der Tabelle über die Bedeutung von \n innerhalb von doppelten Anführungszeichen?
Du bist ganz nah dran. Du schaffst es!
HTH Robert
ich habe erst for 3 tagen mit php angefangen und kenne mich damit allgemein noch nicht so gut aus...
Hello,
ich will das du mir so hilfst das ich es verstehe, in der tabelle ist /n
ich möchte...
mit den ich in die nächste zeile komme, gut , aber was bringt mir das in
und außerdem ist es nicht /n sondern \n
Das Zeichen wird vom Parser ersetzt durch chr(10). Wobei ich kein Windowssytem mit PHP zur Zeit aktiv habe und nicht genau weiß, ob der Parser auf Windows nicht automatisch chr(13).chr(10) daraus macht. Da kann man nur mit einem HexDump prüfen. (oder nachlesen, aber ich glaube keiner Doku, die ich nicht selbst verbrochen habe)
Liebe Grüße aus http://www.braunschweig.de
Tom
ach was soll ich sagen, das ist normal in diesem forum.
1. lese den alten inhalt aus!
$alter_inhalt
2. der neue inhalt steht in
$neuer_inhalt
3. $abspeichern_als = $alter_inhalt."\n".$neuer_inhalt;
und dann kommt dein fopen kram.
verstanden?
Hi,
ach was soll ich sagen, das ist normal in diesem forum.
das ist nicht nur normal, das ist die postulierte Grundphilosophie dieses Forums.
- lese den alten inhalt aus!
$alter_inhalt- der neue inhalt steht in
$neuer_inhalt- $abspeichern_als = $alter_inhalt."\n".$neuer_inhalt;
Wozu diese Ressourcenverschwendung? Durch das Positionieren des Dateizeigers auf EOF mit fopen(...,'a') war er schon weiter als Du.
HTH Robert
Wozu diese Ressourcenverschwendung? Durch das Positionieren des Dateizeigers auf EOF mit fopen(...,'a') war er schon weiter als Du.
och komm Ressourcenverschwendung kann man das auch nicht nennen, ich glaube nicht das das irgnd einem server zu last werden könnte (auch in der summe des scripts gesehen nicht), das merkt man doch überhaupt nicht.
ausserdem warum solange sich mit nem thema beschäftigen wenn die ausführlichere lösung im endeffekt doch die zeitunaufwendigere ist?
Oi,
och komm Ressourcenverschwendung kann man das auch nicht nennen, ich glaube nicht das das irgnd einem server zu last werden könnte (auch in der summe des scripts gesehen nicht), das merkt man doch überhaupt nicht.
nein, ich komm' gar nicht! Vordergründig mag die Ressourcenverschwendung in diesem Fall marginal sein, aber das ist auch nicht das Thema. Der Erzeuger dieses Threads scheint ein Programmieranfänger zu sein, und dann ist es wichtig, das er die Chance hat, sich die vielleicht bedeutendste Eigenschaft eines Entwicklers anzueignen: algorithmische Effizienz. Und da war er bei seinem Problem auf einem guten Weg. Natürlich kann jeder Depp beliebig aufwendig, unübersichtliche, wartungs- und erweiterungsfeindliche und ressourcenfressende Lösungen anbringen; allerdings haben wir weißgott genug von diesen Entwicklern. Der Bedarf nach Zweit- und Drittklassigkeit ist reichlich gedeckt!
Ich sehe in den vermeintlichen Peanuts, um die wir beide uns hier streiten, ein pädagogisches Problem: wenn er zu Beginn schon aufnimmt, das ein paar programmierte Umwege angesichts der Potenz moderner Rechner und Netzwerke belanglos sind, dann wird er das hochwahrscheinlich zu einer Arbeitsgrundlage werden lassen: "Ja und - dauert halt ein paar Millisekunden länger, ist doch eh egal!". Aber er macht es dann grundsätzlich so, und dann ist es durchaus relevant (hochgerechnet auf das Heer der Programmierer, die besser zur Müllabfuhr gegangen oder bei ihr geblieben wären, hat das sogar volkswirtschaftliche Relevanz).
Und nicht zu vergessen - was mir persönlich als noch wichtiger erscheint - Du nimmst im die Chance, die Freude an der höchsteffizienten Lösung zu erfahren. Hast Du einmal erlebt, welche Wirkung ein kurzer, klarer und eleganter Beweis eines komplexen mathematischen Problems auf Deinen Geist haben kann? Wenn Du Dir vorher einen abgebrochen und seitenweise durch die Gegend deduziert oder induziert hast und dann eine solche Lösung präsentierst bekommst? Erst recht, wenn Du zum ersten Mal selbst auf eine solche Lösung kommst? Das können Momente sein, in denen Du eine Ahnung davon bekommst, wie wunderbar die Welt selbst in ihrem kleinsten und verborgensten Detail eingerichtet ist - toll! Anders gesagt: das macht einfach Spaß, und Spaß ist doch das hehrste Ziel der Spaßgesellschaft... Und was ist Programmieren anderes als angewandte Mathematik? Also gib ihm die Möglichkeit der Erkenntnis - es sei denn, Du selber hattest sie noch nicht oder bist zu tumb um sie je zu haben; dann vergeß einfach mein ganzes Gelaber und mach so weiter!
HTH Robert
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