Schreiben mit fwrite - oben anhängen?

hi,

ich lerne momentan gerade ein bisschen PHP und wollte das Gelernet mal mit einem kleinen
GB-Script anwenden.

Nun habe ich das “Problem”, dass der neue Eintrag (HTML-Code), den ich in eine txt-Datei
speichere nicht oben angehängt wird (Modus “ab”), sondern unten, was bei einem Gästebuch
nicht besonders sinnvoll ist.

Gibt es eine Möglichkeit, die neuen Einträge oben anzuhängen?

ich weiss, man könnte die Textdatei auslesen, in einer Variable speichern und danach am
Anfang den GB-Eintrag hinzufügen, aber das wäre irgendwie sinnlose Arbeit, die zuviel
gemacht würde - das muss doch irgendwie gehen :smiley:

greez,
mmemichi

Es gibt keine Möglichkeit einen Neuzugang an den Anfang einer Datei zu schreiben ohne das der Rest nicht zerstört wird.

Abhilfe - einlesen, als Array umwandeln und sortieren.

hi,

schade, dass dies nicht so geht, wie ich mir das gedacht hab.

Wär echt jemand so nett und würde einem php-newbe mal einen beispielcode posten, wie man das mit dem einlesen und speichern dann machen würde? wär echt cool von euch :wink:

greez
mmemichi

Für ein Gästebuch wäre es meiner Meinung nach ohnehin besser das ganze in eine DB zu schreiben. Notfalls auch in eine dateibasierte SQLite.
Dort lässt sich viel leichter sortieren, ändern, löschen,…

Na ja, eine komplette DB muss es ja nun nicht sein.
Ich hatte sowas mal mit mehreren Textdateien gelöst: für jeden Eintrag eine.
Da diese dann als Dateinamen “durchnummeriert” wurden, war auch die Sortierung kein Problem mehr…

In eine (einzige) Textdatei würde ich die Einträge aber nicht schreiben lassen - das gibt nur unnötige Probleme (z.B. beim nachträglichen Editieren, Moderation ist so auch nicht ohne weiteres möglich usw.).

Gästebucheinträge brauch man weder moderieren noch editieren.
Das einzige was vorhanden sein sollte ist eine Löschmöglichkeit für den Admin der Seite.

Alle Einträge in einer Textdatei ist durchaus Möglich, und (meiner Meinung nach) wesentlich leichter handzuhaben, als wenn man jeden Eintrag extra einlesen muss.

Alternativ kann man (wenn man sich damit auskennt), die Daten im Form einer XML-Struktur mit DOMDocument speichern und mit SimpleXML oder DOMDocument wieder auslesen.

mfg Balmung

hi,

eigentlich möchte ich ja nur meine bisherigen kenntnisse anwenden und ein gästebuch
schreiben - ohne datenbanken (das will ich absichtlich, da ich noch kein mySQL kann) und am
liebsten auch ohne jetzt viele funktionen lernen zu müssen, denn die kommen später in
meinem buch dran.

wahrscheinlich werde ich dann - je nachdem was im buch dann kommt - das gästebuch so
verbessern, bzw. verändern, dass man es später in einer db speichert abrufen editieren
löschen oder bestätigen kann, aber ich möchte gerne mal klein beginnen :wink:

Das würde ich nun also doch gerne machen - zumindest momentan. Nur leider weiss ich nicht
genau, wie man eine Datei in eine Variable einliest und danach als Array umwandelt
(logischerweise mit dem neuen Eintrag). Ein klitzekleines Codebeispiel und ich bin glücklich
für den Rest vom Tag :ps: :smiley:
:hail:

greez,
mmemichi

Was man machen könnte oder sollte hier eigentlich egal, da will jemand etwas lernen und die Methode ist nicht schlecht dazu.

Um die Inhalte trennen zu können müsste man wissen wie du das gemacht hast und ob und wie Felder vorhanden sind und wie die getrennt sind:

$delimiter=‘keine Ahnung’;
$data = explode($delimiter,file_get_contents(‘meine_Datei_mit_Pfad’));

Damit hättest du schon mal ein Array.

Ob es sich nun um eine Array mit strings handelt - weis ich nicht da du dein Format nicht beschrieben hast.

$data in einer Schleife abarbeiten und ein Array von Arrays bilden.

Danach ein Key Array bilden und Multisort anwenden - damit kannst du nach einem oder allen Kriterien sortieren wie du lustig bist.

[quote]Gästebucheinträge brauch man weder moderieren noch editieren.
Das einzige was vorhanden sein sollte ist eine Löschmöglichkeit für den Admin der Seite.
[/quote]

Nur am Rande bemerkt von meinen Leuten würde keiner ein solches Gästebuch einsetzen, wenn man nichts editieren kann.

Darüber hinaus würden meine Leute auch ein Gästebuch mit diesen Fähigkeiten nicht verwenden, die sind ganz andere Sache gewöhnt nur um Zeit zu sparen.

du kannst die Datei auch mit file() als Array einlesen.
Danach mit krsort() umkehren und dann mit ner Schleife ausgeben.

Folgende Funktionen sollten da hilfreich sein:

  • Datei in Variable lesen: file_get_contents
  • Zugriff (ent)sperren: flock
  • Daten in Datei schreiben: fputs oder file_put_contents

Damit also Dateiinhalt in Variable, Variableninhalt an neuen
Inhalt anhängen, die Kombination dann wieder abspeichern.
Entsprechend dann sinnvoll sperren und entsperren, damit bei
mehrere gleichzeitigen Zugriffen einer warten muß, bis der andere
fertig ist.

Also ganz ehrlich, ich würde vorher mysql lernen, dann ein ganz einfaches Gästebuch schreiben, und anschließend verbessern z.B. mit Smileys, danach ne Löschfunktion…

Textdateien verwende ich eigentlich nur noch für Counter, dass man da in der einen den Counterstand speichert, und in der anderen die IPs.

Hier finde ich die Reihenfolge zum lernen ganz gut -> tut.php-quake.net/de/

hi,

danke mal an alle, die mir da jetzt etwas geschrieben haben - ich werd mal schauen, was ich
da mache(n kann).

das gästebuch würde ich momentan eh nicht öffentlich machen, d.h. einfach für mich lokal so
als anwendung des gelernten. denn sonst funktioniert eigentlich der grösste teil schon.

im moment mache ich es so, dass wenn der besucher einen eintrag absendet, die
angegebenen informationen als html-code in einer variable gespeichert werden und danach mit
fwrite in die textdatei geschrieben wird. grob gesagt wärs das eigentlich schon, dazu kommen
dann noch die verhinderung von php / html code und ein spamschutz, der noch nicht ganz fertig ist.

greez,
mmemichi

Das wäre die einfachste Lösung wenn man nur die Folge umdrehen will.

$delimiter=‘keine Ahnung’;
$data = krsort(explode($delimiter,file_get_contents(‘meine_Datei_mit_Pfad’)));

hi,

ok leute, konnte das ganze lösen, indem ich das mit file_get_contents eingelesen und mit dem
neuen eintrag zusammengeführt hab. funktioniert nun sogar so, wie ich das wollte.

ich werde das script wahrscheinlich immer etwas ausbessern, je besser meine kenntnisse in
php sind, d.h. es nicht von anderen leuten schreiben lassen, ohne dass ich etwas verstehe.

greez,
mmemichi

Mir hat es am Anfang immer gut geholfen, wenn ich mir Codes von anderen angesehen hab…so kannst du zB MySQL-Befehle einfach kopieren, und musst sie noch nicht verstehen :wink:

<?php

mysql_connect("localhost", "user", "pass");
mysql_select_db("user");

$num_page=10;

function get_posts($begin=0)
{
   global $num_page;

   $sql = "SELECT author, mail, date, post FROM guestbook ORDER BY id DESC LIMIT $begin, $num_page";
   $sql = mysql_query($sql) OR
      die(mysql_error());

   $return = array();
   while($row = mysql_fetch_assoc($sql))
      $return[]=$row;
  
   return $return;
}

Das wäre der komplette Teil zum auslesen, und du hast alle Daten bequem in einem Array :wink:

MySQL-Tabelle: id, author, mail, date, post
ID ist PRIMARY (schnelle sortierung)

bequemer (und schneller) gehts meiner meinung nach nicht :wink:

Genau darum geht es ihm ja hier, sich da langsam durchzulernen. Beispielcodes gibbt es in dem PHP Handbuch z.B. ohne Ende.

Was Mysql betrifft gibt es bequemere Dinge, auch wenn das hier über die Frage hinausschiesst:

$result=$db->GetArray("SELECT author, mail, date, post FROM guestbook ORDER BY id DESC LIMIT ?,? ",array($begin, $num_page));

Da liegt das Ergebnis gleich als Array vor oder false wenn keines vorhanden ist, gleichzeitig werden ? escaped wenn notwendig und das Resultset von Mysql ist bereits frei gegeben.

Der Fragesteller wird bald soweit sein, das er sich mit angebotenen Scripten und Klassen beschäftigen wird. Als sollten wir es dabei belassen.

dein Code ist für eine PEAR-Klasse geschrieben (“DB”), von der Verwendung rate ich ab, da PEAR nicht auf bplaced-Servern installiert ist, und die PHP-Version zu installieren einfach nur überflüssig ist :wink:

[quote=„michi7x7“][code]

<?php mysql_connect("localhost", "user", "pass"); mysql_select_db("user"); $num_page=10; function get_posts($begin=0) { global $num_page; $sql = "SELECT author, mail, date, post FROM guestbook ORDER BY id DESC LIMIT $begin, $num_page"; $sql = mysql_query($sql) OR die(mysql_error()); $return = array(); while($row = mysql_fetch_assoc($sql)) $return[]=$row; return $return; } [/code][/quote] Von einem Array ins andere zu packen, ist nicht gerade sind der sache. :ps: Sinnvoll ist es so schon mal gar nicht. o.0

Blöde Idee.
Wenn man es in einer Datei speichern will, ist es viel einfacher, das ganze in einer PHP-Datenstruktur abzubilden und die direkt zu serialisieren und dann in einer Datei zu speichern.