CrazyStephan: fopen mit a ... nicht an das Ende, sondern den Anfang setzen

Hallo,
ich kann ja bei fopen mit a festlegen, dass die Daten jedes mal an das Ende gesetzt werden, und mit w, dass die Daten jedes Mal an den Anfang gesetzt, aber leider die nachfolgenden Daten überschrieben werden.
Wie setze ich die Daten jedes Mal an den Anfang, ohne dass die nachfolgenden Daten überschrieben werden??
Es geht letztendlich um Gästebuch-Einträge, bei denen die neuen Einträge oben (zuerst) stehen sollen.
Stephan

  1. Hello,

    ich kann ja bei fopen mit a festlegen, dass die Daten jedes mal an das Ende gesetzt werden, und mit w, dass die Daten jedes Mal an den Anfang gesetzt, aber leider die nachfolgenden Daten überschrieben werden.
    Wie setze ich die Daten jedes Mal an den Anfang, ohne dass die nachfolgenden Daten überschrieben werden??
    Es geht letztendlich um Gästebuch-Einträge, bei denen die neuen Einträge oben (zuerst) stehen sollen.

    Hier bringst Du physische und logische Ordnung von Daten durcheinander.
    Die Fileopen-Modes beziehen sich auf die physische Organisation und Handhabung der Dateien.

    Deine Ausgabe folgt aber, wenn Du deine Scripte strukturiert aufbaust, auch einer logischen Ordnung. Das bedeutet also, dass Du die Daten erst einmal beschaffst aus der Datei und dann im Speicher so organisierst, wie es für die Ausgabe gut ist.

    Dabei können Dir z.B. die Funktionen file() oder explode() helfen, wenn die Textdatei nicht zu groß wird, in der die Gästebucheinträge abgelegt werden.

    http://de3.php.net/manual/en/function.file.php
    http://de3.php.net/manual/en/function.explode.php

    und eventuell noch
    http://de3.php.net/manual/en/function.array-reverse.php

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  2. Hi,

    Wie setze ich die Daten jedes Mal an den Anfang, ohne dass die nachfolgenden Daten überschrieben werden??

    das geht nicht - dann müsste ja bei jedem Schreibvorgang automatisch der restliche Dateiinhalt aufgerückt werden.

    Es geht letztendlich um Gästebuch-Einträge, bei denen die neuen Einträge oben (zuerst) stehen sollen.

    Dann gibt's mehrere Möglichkeiten.

    Du könntest bei jedem neuen Eintrag erst alle Datensätze lesen, dann alle Datensätze -beginnend mit dem neuen- erneut schreiben.

    Du könntest auch den neuen Datensatz am Ende anhängen, und bei der Anzeige einfach in umgekehrter Reihenfolge anzeigen.

    Nebenbei bemerkt: Ich finde es widersinnig, wenn der neueste Eintrag oben steht, auch wenn diese Unart oft angewendet wird. Chronologisch wachsende Listen werden normalerweise von oben nach unten fortgeschrieben. Intuitiv erwarte ich daher den neuesten Eintrag ganz unten.

    Ciao,
     Martin

    --
    Zwei Stammtischbrüder:
    Hier steht, dass laut Statistik über 60 Prozent aller Ehefrauen fremdgehen.
    Was soll ich mit dieser Information? Ich brauche Namen, Fotos, Telefonnummern ... !
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  3. Hallo,
    ich kann ja bei fopen mit a festlegen, dass die Daten jedes mal an das Ende gesetzt werden, und mit w, dass die Daten jedes Mal an den Anfang gesetzt, aber leider die nachfolgenden Daten überschrieben werden.
    Wie setze ich die Daten jedes Mal an den Anfang, ohne dass die nachfolgenden Daten überschrieben werden??
    Es geht letztendlich um Gästebuch-Einträge, bei denen die neuen Einträge oben (zuerst) stehen sollen.
    Stephan

    Also mein Code ist:

    <?php  
    	$daten=$_POST[kommentar].'<br />von <a href="mailto:'.$_POST[mail].'">'.$_POST[name].'</a><br /><strong>'.date("d.m.&#8217;y, H:i").'</strong><br />';  
    	$datenbank='daten.dat';  
    	$datei=fopen($datenbank,'a');  
    	fwrite($datei, $daten);  
    ?>
    

    Hauptdatei:

    <?php  
    	$datenbank='daten.dat';  
    	$datei=fopen($datenbank, 'r');  
    	fpassthru($datei);  
    ?>
    

    Ich scheitere nur am Setzen der Daten ... eben dass die neuen Einträge oben (zuerst) stehen sollen !!!
    Das muss doch irgendwie gehen!!!
    :(

    1. Hi!

      Also mein Code ist:
      $daten=$_POST[kommentar].'<br />von <a href="mailto:'.$_POST[mail].'">'.$_POST[name].'</a><br /><strong>'.date("d.m.&#8217;y, H:i").'</strong><br />';

      ... leider wieder anfängertypisch anfällig gegen diesmal HTML-Injection. Bitte versteh die Problematik des Kontextwechsels und schreib sicheren Code.

      Ich scheitere nur am Setzen der Daten ... eben dass die neuen Einträge oben (zuerst) stehen sollen !!!
      Das muss doch irgendwie gehen!!!

      Nicht mit dem Dateisystem allein. Das hat, wie dir schon gesagt wurde, weder eine Möglichkeit, etwas vor eine Datei zu schreiben, noch etwas dazwischen einzufügen. Alles was es bietet ist das Anhängen. Es gibt nun die zwei Möglichkeiten: Die gesamte Datei neu schreiben, dabei zuerst den neuen Text und anschließend den alten. Oder du hängst das neue einfach hinten an und sortierst bei der Ausgabe um. Erstere ist beim Schreiben aufwendiger, letztere beim Lesen. Das macht sich allerdings erst bei großen Datenbeständen ernstlich bemerkbar, dann aber will man meist eine geeignetere Datenhaltung habe.

      Im Allgmeinen auch nicht besonders clever ist, dass du die Daten gleich in formatierter Form ablegst. Das ist ungünstig, wenn dir irgendwann mal einfällt, dass du eine andere Ausgabeform haben möchtest. Besser ist es, sie in Rohform abzulegen und erst bei der Ausgabe zu formatieren. Ein für kleinere Datenbestände geeignetes Format ist CSV. PHP bietet für das Lesen und Schreiben auch Funktionen an: fgetcsv() und fputcsv().

      Lo!

    2. Hello Stephan,

      dedlfix hat Dir in seiner Antwort schon das CSV-Format zum Speichern empfohlen.
      https://forum.selfhtml.org/?t=201988&m=1363584
      Ich empfehle Dir noch eine andere Möglichkeit und möchte Dich gleichzeitig auch noch auf das Problem der Nebenläufigkeit hinweisen.
      http://aktuell.de.selfhtml.org/artikel/programmiertechnik/dateisperren/

      Wenn mehrere Clients über ihre Ressource-Scripte gleichzeitig auf die Datei zugreifen dürfen, was bei Webanwendungen fas immer der Fall ist, muss man die Zugriffe serialisieren. Während ein Request ein (Lesen + )Schreiben veranlasst, müssen die anderen einen Moment warten. Dabei müssen die Leseprozesse und die Schreibprozesse jeweils zu einem gebunden werden, damit niemand anderes dazwischenfunken kann.

      Also mein Code ist:

      <?php

      $daten=$_POST[kommentar].'<br />von <a href="mailto:'.$_POST[mail].'">'.$_POST[name].'</a><br /><strong>'.date("d.m.&#8217;y, H:i").'</strong><br />';
      $datenbank='daten.dat';
      $datei=fopen($datenbank,'a');
      fwrite($datei, $daten);
      ?>

      
      >   
      > Hauptdatei:  
      > ~~~php
      
      <?php  
      
      > 	$datenbank='daten.dat';  
      > 	$datei=fopen($datenbank, 'r');  
      > 	fpassthru($datei);  
      > ?>
      
      

      Du hast ausßerdem die Anführungszeichen für die Elementbezeichner im $_POST-Array vergessen.

      Mein Vorschlag deshalb:

      Benutze die Funktionen serialize() und unserialize() und speichere einfach die Post-Daten atomistisch in diesem Array, also benutze für jedes gewünschte Element aus dem Post-Array auch ein Element im Datensatz des Speicherarrays.

      Ich schreibe nachher noch etweas mehr dazu.
      Schau dir schon mal die Funktionen an und lies den Artikel von Christian.
      http://de.php.net/manual/en/function.serialize.php

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de