letzte Zeile in .txt löschen
Nico
- php
Hallo!
Als ich im Archiv gesucht habe, wie ich eine Zeile aus einer .txt löschen kann, bin ich auf das hier gestoßen: http://www.php-faq.de/q/q-datei-einfuegen.html. Ich habe dann versucht das Skript so umzuschreiben, dass wenn in einer Textdatei mehr als x Zeilen sind, die letzte gelöscht wird. Das ist dabei rausgekommen:
$avar = file("chat.txt");
$zeilenanzahl = count($avar)+1;
if ($zeilenanzahl>9){
// Shared lock auf die Quelldatei
$oldfile="chat.txt";
$old = fopen("chat.txt", "r");
flock($old, 1) or die("Kann die Quelldatei $oldfile nicht locken.");
// Exclusive lock auf die Zieldatei
$new = fopen($oldfile.".new", "w");
flock($new, 2) or die("Kann die Zieldatei $newfile nicht locken.");
$lineno = 0;
while($line = fgets($old, 1024)) {
if ($lineno++ == 10)
continue; // Zeile auslassen
fputs($new, "");
}
fclose($old); // Gibt das Lock automatisch auf
// Alte Datei wegwerfen.
unlink($oldfile);
// Neue Datei umbenennen.
// (In Windows müssen das rename() und das fclose($new)
// vertauscht werden, da es nicht möglich ist, in Windows
// eine offene Datei umzubenennen.
// Neue Datei schließen und dabei Lock aufgeben.
fclose($new);
rename($oldfile.".new", $oldfile);
}
Da kam dann als erstes immer der Fehler, dass die Quelldatei nicht gelockt werden kann. Das ist ja erstmal nicht weiter tragisch. Ich habs also einfach erstmal auskommentiert.
Aber jetzt kommt der Fehler: ich habe mit einem Formular immer neue Zeilen in die .txt geschrieben. Als dann neun Zeilen in der Datei waren, löschte das Skript alle neun und schrieb dann nur den neuen rein. An welcher Stelle habe ich das Skript denn falsch umgeschrieben?
Ich hoffe, mir kann und wird jemand helfen.
Nico
Hi,
schau dir mal folgende Seite an:
http://de.php.net/manual/de/function.fopen.php
Du darfst die Datei nicht im Mode w öffnen sonder mit a.
MfG
Otto
echo $begrüßung;
$avar = file("chat.txt");
Da du hier schon den gesamten Inhalt der Datei in ein Array einliest, wäre es einfacher, dieses zurechtzustutzen (unset() oder array_s(p)lice()), dann das Array zu implode('', ...)-ieren und den daraus entstehenden String zu file_put_contents()-en (PHP5 vorausgesetzt, sonst fopen(), 1x fwrite(), fclose()).
Als dann neun Zeilen in der Datei waren, löschte das Skript alle neun und schrieb dann nur den neuen rein. An welcher Stelle habe ich das Skript denn falsch umgeschrieben?
Da du nicht geschrieben hast, wie du die Zeile anhängst, kann ich mich nur der Vermutung von Otto anschließen.
echo "$verabschiedung $name";
Hallo!
Hinten an dem Code, den ich schon gepostet habe ist dann noch folgender:
$datei=fopen("chat.txt","r");
$read = file_get_contents("chat.txt");
fclose($datei);
if ($_POST[send]=="Senden"){
$datei=fopen("chat.txt","w");
$inhalt="$_POST[eing]<br>\r\n$read";
fwrite($datei,$inhalt);
fclose($datei);
}
$datei=fopen("chat.txt","r");
$read = file_get_contents("chat.txt");
fclose($datei);
$read=str_replace("'","'",$read);
echo "
<form action='index.php' method='post'>
<div style='max-height:500px; border:1px solid grey'>$read</div>
</textarea><br>
<input name='eing'>
<input type='submit' value='Senden' name='send'>
</form>";
Ich hoffe, das hilft bisschen weiter.
Nico
echo $begrüßung;
$datei=fopen("chat.txt","r");
$read = file_get_contents("chat.txt");
fclose($datei);
file_get_contents() öffnet und schließt die Datei selbstständig. fopen() und fclose() sind überflüssig.
Der Fehler lag doch im anderen Teil. Du schreibst beim Umschreiben für jede Zeile einen Leerstring statt der Zeile. fputs($new, "");
echo "$verabschiedung $name";
Hallo!
Aha. Aber da das mein erstes Projekt mit Dateiverarbeitung ist, hab ich da noch nicht so viel Ahnung. Wie müsste das denn da richtig heißen?
Nico
echo $begrüßung;
Wie müsste das denn da richtig heißen?
Du schreibst beim Umschreiben für jede Zeile einen Leerstring statt der Zeile. fputs($new, "");
Nun, statt Leerstring musst du die Zeile schreiben, welche sich bei dir in der Variable $line befindet.
echo "$verabschiedung $name";
Ja! Es funktioniert! Vielen Dank an alle, die mich unterstützt haben.
Nico
echo $begrüßung;
Ja! Es funktioniert! Vielen Dank an alle, die mich unterstützt haben.
Nun ja, es funktioniert, aber ziemlich umständlich.
$chatFileName = 'chat.txt';
// Chat-Datei in Array ein lesen
$chat = file($chatFileName);
if (isset($_POST['send']) and $_POST['send'] == "Senden") // [*] Fußnote beachten
// neue Zeile hinzufügen
array_unshift($chat, $_POST['eing'] . "\n");
// ab Zeile 11 löschen
array_splice($chat, 10);
// zurückschreiben
$newFile = fopen($chatFileName, 'w');
fwrite($newFile, implode('', $chat));
fclose($newFile);
Was noch fehlt ist file locking und eine Fehlerbehandlung beim Schreibvorgang.
Ich hab das <br> beim Einfügen weggelassen. Die Ausgabe erfolgt dann so:
$chatContent = file_get_contents($chatFileName);
echo nl2br(htmlspecialchars($chatContent));
Mit dem htmlspecialchars() stellst du sicher, dass die Zeichen <, >, " und & HTML-gerecht maskiert werden. Damit wird die Einschleusung von HTML- und sonstigem Script-Code entschärft.
echo "$verabschiedung $name";
[*] Das Absenden mit Enter funktioniert im IE nicht, weil der, anders als bspw. der FireFox, den Button nicht mitsendet. Hier hilft ein gleichlautendes hidden field. Oder du testest gleich auf
isset($_POST['eing']) and strlen($_POST['eing'])