PHP überschreibt Daten in Datei anstatt sie einzufügen

Wir sammeln alle Infos der Bonusepisode von Pokémon Karmesin und Purpur für euch!

Zu der Infoseite von „Die Mo-Mo-Manie“
  • Hallo alle zusammen. Ich glaube der Titel sagt eh schon viel aus. Im Grunde habe ich ein eigenes Logskript geschrieben, dass die Zugriffe auf die Homepage nach IP und Datum sortieren sollte und anschließend als .txt Datei speichert. Also ein etwas exklusiveres Logfile. Das ganze sieht so aus:

    PHP
    //Geordnete IP Logdatei /*  * gesamte Datei durchsuchen  * wenn IP gefunden, Tag suchen, dann eintragen  * wenn IP gefunden, kein Tag, -> neuer Tag, auf Anfang setzen (rekursiv)  * wenn keine IP, neue IP ,-> auf Anfang setzen (rekursiv)  * Bsp.:  * ###############  * ***.116.**.58  * ###############  *     * 2015-12-12  * 15:38:42 --> de --> 200 -->/index.php                   */  function orderedIPLog($handle, $ip, $fehlerCode, $lang, $dateizugriff, $datum, $zeit){ /*  * $handle = Dateizeiger  * $ip = Clientip  * $fehlerCode = erzeugter HTTP Status Code  * $lang = Clientsprache  * $dateizugriff = Datei auf die zugegriffen wurde           */   //Dateizeiger auf Anfang setzen rewind($handle); //gehe gesamte Datei durch while(!feof($handle)) { //Datei komplett durchlaufen  while(!feof($handle))  { //Zeile lesen & Leerzeichen vom Ende entfernen   $buffer = rtrim(fgets($handle, 4096));   if($buffer==$ip)   { //IP gefunden    while(!feof($handle))    { //Zeile lesen & Leerzeichen vom Ende entfernen     $buffer = rtrim(fgets($handle, 4096));     if($datum==$buffer)     { //IP & Tag gefunden      while(!feof($handle))      { //Zeile lesen & Leerzeichen vom Ende entfernen       $buffer = rtrim(fgets($handle, 4096));              if($buffer=="###############" || feof($handle) )       {  //Am Ende des letzten (gesuchten) Tages ist entweder eine neue IP oder FEOF        //Dateizeiger von der jetztigen Position wieder eine Zeile zurückbewegen, (also ans Ende der letzten Zugehörigen)        fseek($handle, $counter_1, SEEK_SET);        //und eine neue Zeile anhängen        fputs($handle, $zeit."\t".$lang."\t".$fehlerCode."\t".$dateizugriff."\n");        return;       }       else       { //Alte Dateizeigerposition speichern        $counter_1=ftell($handle);       }      }     }     elseif(feof($handle) || $buffer=="###############")     { //IP gefunden, aber am Ende der Datei oder bei der nächsten IP ohne den Tag gefunden zu haben      if(feof($handle))      { //Wenn am Dateiende       //Zeiger am Schluss platzieren       fseek($handle, 0, SEEK_END);       //Neuen Tag schreiben       fputs($handle, "\n".$datum."\n");       //Nochmals den Tag suchen       orderedIPLog($handle, $ip, $fehlerCode, $lang, $dateizugriff, $datum, $zeit);       return;            }      else      { //Statt dem Tag bereits bei der nächsten IP gelandet.       //Dateizeiger wieder um eine Zeile zurück verschieben       fseek($handle, $counter, SEEK_SET);       //Neuen Tag schreiben       fputs($handle, "\n".$datum."\n");       //Nochmals den Tag suchen       orderedIPLog($handle, $ip, $datum, $zeit, $fehlerCode, $lang, $dateizugriff, $datum, $zeit);       return;            }     }      //Alte Dateizeigerposition speichern      $counter=ftell($handle);    }    }   elseif(feof($handle))   { //Am Ende der Datei und keine IP gefunden    //Dateizeiger ans Ende setzen    fseek($handle, 0, SEEK_END);    //IP schreiben    fputs($handle, "\n###############\n".$ip."\n");    //Nachdem die IP eingefügt wurde nochmals danach mit einem rekurisven Aufruf suchen.    orderedIPLog($handle, $ip, $fehlerCode, $lang, $dateizugriff, $datum, $zeit);    return;   }  } }}


    Aufgerufen wird es hier:


    PHP
    $Tag=date("Y-m-d");
    $Uhrzeit=date("H:i:s"); 
    $fp_geordnet=fopen("iplog_geordnet.txt", "r+");
    orderedIPLog($fp_geordnet, $client_ip, $HttpStatus, $langCode, $requestURL, $Tag, $Uhrzeit);
    fclose($fp_geordnet);

    Alles funktioniert wunderbar, bis darauf wenn ich innerhalb der Datei, also nicht am Ende etwas einfügen möchte, wird die Datei teilweise überschreiben und die Zeichen werden nicht eingefügt. Gibt es da irgendein Flag oder ähnliches um das zu ändern?

  • Code
    ###############46.***.249.472015-12-1123:00:30	de	200	/23:00:51	de	200	/bildergalerie.php?ordner=Stammtisch%20Amag%20201423:05:28	de	200	/bildergalerie.php?ordner=Stammtisch%20Amag%202014###############88.***.62.582015-12-1422:57:33	de	200	/###############86.***.146.502015-12-1123:06:57	de	200	/bildergalerie.php?ordner=Stammtisch%20Amag%20201423:07:16	de	200	/bildergalerie.php?ordner=Stammtisch%20Amag%20201423:13:46	de	200	/23:15:38	de	200	/23:15:52	de	200	/index.php

    wird zu


    Also in die 6. Zeile sollte etwas eingefügt werden, aber es wird einfach die nächste Zeile überschrieben und nimmt wenn "nötig" auch noch die übernächste mit

  • Ich denke du willst aus
    "someoldata"
    "someoldandnewdata"
    machen. Also irgendwas in die Datei einfügen und alles was danach steht nach hinten verschieben.
    jedoch gibt es dafür keine so vordefinierte Funktion. Auf Festplattenebene kann man nicht einfach mal etwas Platz schaffen und Daten in vorhandene Datein einbauen, ohne dass zuvor vorhandene Daten verloren gehen. Eine vorgebene Methode mit solch einer Funktionalität schnell viele unnötige Schreib- und Lesevorgänge einbauen würde, daher existiert sie nicht. Entsprechend wäre hier die Lösung:
    - lies alle Daten von dem Punkt an, an dem du die neuen Daten später speichern möchtest
    - speichere diese temporär in einer Variable
    - geh wieder zum Punkt von dem aus du die neuen Daten schreiben möchtest
    - schreib die neuen Daten
    - schreib nun die temporär gespeicherten Daten
    - fertig


    Anders geht es nicht auf den mir bekannten Systemen