Zeile einer Text datei ändern

ATdrag0N

Erfahrenes Mitglied
Hallo,
ich möchte aus einer text datei eine Zeile verändern aber auch nur diese.

index.php
Code:
<?php
$id = ($_GET[id]."test.txt");
$lines = file ("$id");
$test1= $lines[0];
$test2= $lines[1];
$test3 = $lines[2];
$test4 = $lines[3];
$test5= $lines[4];
$test6= $lines[5];
$test7= $lines[6];
?>
<html>
<body>
<form action="test.php" method="post" name="form1" class="text">
<p>
<textarea name="text" cols="90" rows="15" wrap="OFF" id="text">
<?php echo $test7?>
</textarea> 
</p> 
<p> 
<input type="submit" name="Submit" value="speichern">&nbsp;&nbsp;&nbsp;
<INPUT TYPE="reset" value="zurücksetzen">
</p> 
</form>
</body>
</html>

Ich komme aber nun nicht mehr weiter wie die test.php aussehen muss das er das was in
der textarea eingegeben wurde in der bestimmten Zeile von der Text datei schreibt.

test.php
Code:
<?php 
$text = $HTTP_POST_VARS["text"]; 
$datei = fopen("test.txt", "w"); 
fwrite ($datei, $text); 
fclose ($datei); 
?>

Mit diesem Script schreibt er mir das was in der textarea eingegeben wurde in der ersten Zeile und löscht dabei die anderen.

Ich hoffe es kann mir einer helfen.
 
Das er dir die anderen Zeilen löscht liegt an dem "w" in fopen. Benutze doch bitte mal das PHP-Manual und sie nach, wie diese Funktion funktioniert, dann wirst du auch recht schnell den richtigen Parameter finden, der dir deine Aktion erlaubt. Im übrigen kannst du aber eigentlich das so lassen wie es ist. Mach es doch einfach so.
PHP:
<?php
   $file = $_GET['file'];
   $line = $_GET['line'];

   // zu bearbeitendene Datei zeilenweise in ein Array einlesen 
   $lines = file("$file");
?>
Über
PHP:
$lines[$line];
Kannst du nun die Zeile ansprechen, die geändert werden soll. Das machst du und öffnest dann die Datei mit.
PHP:
<?php
   $fp = fopen("$file", "w"); 
   foreach($lines as $key => $text)
   {
      fputs($fp, $text);
   } 
   fclose ($fp);
Wie du siehst wird der Inhalt der Datei durch den Parameter "w" in fopen() gelöscht, jedoch wieder hineingeschrieben, da er ja inklusive der veränderten Zeile in $lines steht. Ich hoffe, dass dir das geholfen hat.
MfG, Andy
 
Sorry aber irgendwie blicke ich da nicht durch,
kannst du mir bitte denn quellcode schreiben der in die test.php rein kommt.
Ich weiss einfach kopieren ist nicht gerade schön,
aber ich erlerne gerade php und eh ich da am verzweifeln bin würde ich dich gern darum bitten.
 
Hallo,

was würdest du daraus lernen wenn dus einfach kopierst? Nichts. Also lies es dir bitte durch. So schwer verständlich ist es nicht.
 
Ich weiss das man nichts lernen kann beim kopieren.
Ich steige aber nicht hinter wie ich bei dem code die Zeile angeben tuhe wo er schreiben soll.
Also bitte keine dummen Bemerkungen, jeder hat mal klein angefangen.
 
Es ist eigentlich ganz einfach. Du übergibst an deine test.php über die URL zwei Variabeln (kann auch über ein Formular geschehen). Das sieht so aus:
Code:
deine-domain.tld/test.php?file=diedatei&line=diezeile
Diese Variabeln kannst du nun in der test.php auslesen und in andere Variabeln speichern (überprüfen solltest du sie auch):
PHP:
$file = $_GET['file'];
$line = $_GET['line'];
Dann ließt du die Datei, die du bearbeiten willst, mit PHP zeilenweise in ein Array.
PHP:
$lines = file("$file");
Dieses Array sieht dann ungefähr so aus:
Code:
$lines[0] = 1.Zeile
$lines[1] = 2.Zeile
$lines[2] = 3.Zeile
$lines[3] = 4.Zeile
usw.
Möchtest du eine Zeile bearbeiten musst du das Array also nur mit der Zeilennummer abzüglich 1 ansprechen, da PHP ja ab NULL zählt.
Das sieht dann also so aus:
PHP:
$lines[$line-1] = "neuer Inhalt der Zeile $line";
Möchtest du jetzt den Inhalt in der eigentlichen Datei ändern musst du einfach nur den Inhalt der Datei löschen und den Inhalt des Arrays in die Datei schreiben.
PHP:
   $fp = fopen("$file", "w"); 
   foreach($lines as $key => $text)
   {
      fputs($fp, $text);
   } 
   fclose ($fp);
Du öffnest die Datei also mit fopen(), das "w" sorgt dafür, dass der Inhalt der Datei gelöscht und der Dateizeiger auf den Anfang gesetzt wird. Nun durchläufst du den Inhalt des Arrays mit foreach() und schreibst den neuen Inhalt zeilenweise mit fputs() in die Datei. Mit fclose() schließt du die Datei und bist fertig.

Ich hoffe, dass das nun verständlicher für dich ist. Das erstellen des Script dürfte nun sehr einfach sein. Vergiss aber bitte nicht, dass du globale Variabeln, wie $_POST[] und $_GET[] niemals ungeprüft verwenden darfst. Dass heißt, dass du sie vor ihrer Nutzung daraufhin überprüfen musst, ob sie existieren, einen Inhalt haben und dass dieser Inhalt auch das ist, was du haben willst, also in diesem Fall ein Pfad zu einer Datei und eine Zeilennummer, also eine Zahl.
MfG, Andy
 
@Catull

danke dir für die Hilfe,
allerdings hatte der immer nur denn ein Text abgespeichert.
PHP:
$lines[$line-1] = "neuer Inhalt der Zeile $line";

ich habe denn Code vollgender Massen abgeändert und so geht es nun.

PHP:
<?php
$text = $HTTP_POST_VARS["text"];
$file = $_GET['file']; 
$line = $_GET['line'];
$lines = file("$file");
$lines[$line-1] = "$text"; 
   $fp = fopen("$file", "w");  
   foreach($lines as $key => $text) 
   { 
      fputs($fp, $text); 
   }  
   fclose ($fp); 
?>
 
Natürlich speichert der immer nur den einen Text. War ja auch nur ein Beispiel. Zudem solltest du mal überprüfen, welche PHP-Version bei dir installiert ist. HTTP_POST_VARS ist nämlich schon veraltet. So etwas fragt man eigentlich mit $_POST['variabelname'] ab.
MfG, Andy
 
Zurück