Peter: Gästebuch programmieren

Hallo zusammen

Ich programmiere gerade ein Gästebuch und versuche, die Daten in einer Datei getrennt durch || zu speichern.
Das sollte dann so aussehen:
var1||var2||var3||var4
Bisher sieht es aber so aus:
var1||var2||var3||var4||

Nun versuche ich verzweifelt, die letzten beiden Trennzeichen zu entfernen und habe es so versucht:

foreach ($_POST as $wert)
{
$wert = addslashes($wert);
$wert = ereg_replace("(\r\n|\r|\n)","<br>", $wert);
$dat .= $wert;
 if (current($_POST)!=count($_POST)) {
 $dat .= "||";
 }
}

Funktioniert leider nicht. Ich hatte mir das so gedacht, dass immer ein Trennzeichen an eine Variable/Information angefügt wird, es sei denn der aktuelle Positionszeiger ist gleich der Anzahl der Array-Elemente.

Habt ihr Ideen?

Peter

  1. Ich programmiere gerade ein Gästebuch und versuche, die Daten in einer Datei getrennt durch || zu speichern.

    Na, hoffentlich bringt Dich niemand durcheinander, wenn er || eingibt..

    Das sollte dann so aussehen:
    var1||var2||var3||var4
    Bisher sieht es aber so aus:
    var1||var2||var3||var4||

    PHP bietet eine Funktion, mit der sich Einzelteile mit einem "Klebestück" zusammenpappen lassen. Schau mal in die Anleitung, Du findest die Funktion entweder im Kapitel Arrays oder Strings.

    Gruß,
      soenk.e

    1. Ich programmiere gerade ein Gästebuch und versuche, die Daten in einer Datei getrennt durch || zu speichern.

      Na, hoffentlich bringt Dich niemand durcheinander, wenn er || eingibt..

      Da werde ich noch was einbauen, sodass das nicht mehr möglich ist. Oder gibt es noch eine bessere Alternative?

      PHP bietet eine Funktion, mit der sich Einzelteile mit einem "Klebestück" zusammenpappen lassen. Schau mal in die Anleitung, Du findest die Funktion entweder im Kapitel Arrays oder Strings.

      Ich habe die Funktion leider nicht gefunden. Wie heißt sie denn?

      Peter

      1. Hallo,

        Ich habe die Funktion leider nicht gefunden. Wie heißt sie denn?

        Na, implode() heißt sie.

        Ach noch was, was ich oben vergessen habe. Wenn Du die Daten mit implode() zusammengepappt hast, dann musst Du noch ein "\n" hinten dranhängen vor dem Wegschreiben.

        Wenn Du die Datei dann später wieder ausliest (z.B. mit $datei=file()), musst Du daran denken, dass Du vor dem explode das Zeichen hinten wieder abschneidest.

        also z.B.:

        $felder=explode(chop($datensatz));

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
  2. Hallo,

    schau Dir mal den Befehl "explode" an (http://www.selfphp.info/funktionsreferenz/string_funktionen/explode.php)
    Das dürfte das einfachste sein...

    Grüße: Alex

    --
    ...habe übrigens auch mal ein Gästebuch mit Text-Files gemacht: http://alex.ilosuna.org/gaestebuch-info.html
    1. schau Dir mal den Befehl "explode" an

      Was bringt mir denn der Befehl an dieser Stelle? Es geht ja nicht darum, dass ich Daten auslesen, sondern welche schreiben möchte.

      Zudem habe ich noch eine andere Frage:
      Wie kann ich prüfen, ob eine Datei überhaupt vorhanden ist?

      Peter

      1. Hallo Peter,

        schau Dir mal den Befehl "explode" an
        Es geht ja nicht darum, dass ich Daten auslesen, sondern welche schreiben möchte.

        dann ersetzt das 'ex' eben durch 'im' und verwende implode() :-)

        Wie kann ich prüfen, ob eine Datei überhaupt vorhanden ist?

        mit file_exists ->http://www.php.net/manual/de/function.file-exists.php

        Grüße aus Nürnberg
        Tobias

        --
        sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
        (Selfcode -> http://emmanuel.dammerer.at/selfcode.html)
        1. Danke, beide Probleme gelöst.

          Peter

          1. Hallo,

            na zwei Probleme hast Du auf jeden Fall noch.
            Das Trennzeichen für die Felder sollte eines sein, dass im Text nicht enthalten sein kann. Und da Du in einer Datei mit Wahlfreier Satzlänge abspeicherst (PHP sltellt leider keine fertigen Record-Funktionen zur Verfügung für feste Satzlänge), musst Du das Zeilenende-Zeichen noch austauschen.

            Es bieten sich aus Tradition für den Feldtrenner #004 und für das Return im Text #127 an. Die stehen frei zur Verfügung und können nicht vom Browser kommen. Allerdings sollte man nden Text vorher trotzdem darauf scannen und wenn welche drinstehen, einfach durch #32 ersetzen. Kann ja nur passieren, wenn Dich jemand ärgern will.

            Vor der Ausgabe musst Du dann natürlich erst die Rückwandlung vornehmen und das #127 je nach Ausgabeziel durch #13#10<br /> oder eben nur durch #13#10 oder #10 oder #13 ersetzen.

            Sind ja nur drei klitzekleine Funktionen, die Du Dir da schreiben musst und ein paar Konstanten, die Du definieren solltest.

            ----------------------------------------------------------------------------
            Bei der Gelegenheit habe ich festgestellt, dass mysql_escape_string() nix taugt. ein #13#10 wird durch den Text \r\n ersetzt. Wenn man dann später ein stripslashes() drüberlaufen lässt, steht der Text rn anstelle eines Umbruches im Feld. Es müsste also \r\n daraus werden. Ergo: mysql_excape_string() ist unbrauchbar.

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
            1. na zwei Probleme hast Du auf jeden Fall noch.
              Das Trennzeichen für die Felder sollte eines sein, dass im Text nicht enthalten sein kann. Und da Du in einer Datei mit Wahlfreier Satzlänge abspeicherst (PHP sltellt leider keine fertigen Record-Funktionen zur Verfügung für feste Satzlänge), musst Du das Zeilenende-Zeichen noch austauschen.

              Wieso? Bisher habe ich \n als Zeilenende, ist das nicht gut?

              Es bieten sich aus Tradition für den Feldtrenner #004 und für das Return im Text #127 an. Die stehen frei zur Verfügung und können nicht vom Browser kommen. Allerdings sollte man nden Text vorher trotzdem darauf scannen und wenn welche drinstehen, einfach durch #32 ersetzen. Kann ja nur passieren, wenn Dich jemand ärgern will.

              Wie mache ich das denn?
              $dat = ereg_replace("(\r\n|\r|\n)","#127", $dat);
              So habe ich versucht, alle Zeilenumbrüche des Postings in das Zeichen #127 umzuwandeln, allerdings werden nun alle Zeilenumbrüche in den String "#127" umgewandelt.

              Vor der Ausgabe musst Du dann natürlich erst die Rückwandlung vornehmen und das #127 je nach Ausgabeziel durch #13#10<br /> oder eben nur durch #13#10 oder #10 oder #13 ersetzen.

              Wofür stehen denn #10 und #13? Kann ich nicht bei der Ausgabe #127 wieder in <br> oder \n umwandeln?

              Danke für deine Hilfe,
              Peter

              1. Hallo,

                das Zeilenende-Zeichen musst Du aud den Feldern selber rausschmeißen bzw ersetzen. Denn Du brauchst es ja für die Textdatei als Satzende-Zeichen.

                define ("CRLF",chr(13).chr(10));
                define ("CR",chr(13));
                define ("LF",chr(10));

                define ("WS",chr(32));
                define ("N","<br />");
                define ("SEP",chr(8));
                define ("RET",chr(127));

                //-----------------------------------------------------------------------------
                function clean($var)  // vor der Speicherung in einer Textdatei
                {
                  $var = str_replace(CRLF,RET,$var);  // kommt vom Windows-Client
                  $var = str_replace(CR,RET,$var);    // kommt vom MAC-Client
                  $var = str_replace(LF,RET,$var);    // kommt vom Unix-Client

                $var = str_replace(SEP,WS,$var);    // Variablen-Seperator entfernen

                return $var;
                }

                //-----------------------------------------------------------------------------
                function restore($var)  // Zur Darstellung in einer Textarea
                {
                  $var = str_replace(RET,"\n",$var);  // Umbruch wiederherstellen
                  $var = htmlentities($var);
                  $var = stripslashes($var);         // Magic-Quotes entfernen
                  return $var;
                }

                //-----------------------------------------------------------------------------
                function file2html($var)  // zur Darstellung in normalem HTML-Text
                {
                  $var = str_replace(RET,"\n",$var);  // Umbruch wiederherstellen
                  $var = htmlentities($var);
                  $var = stripslashes($var);         // Magic-Quotes entfernen
                  $var = nl2br($var);
                  return $var;
                }

                //-----------------------------------------------------------------------------

                Schau mal, ob Du damit glücklich wirst. Hat mir so schon länger gute Diesnte geleistet. Bei der Gelegenheit: Zur Speicherung in einer mysql-Datenbank ist mysql_escape_string() NICHT geeignet, wenn #13#10 in den Strings stehen. Das Ding ist nicht konsequent zuende gedacht.

                Liebe Grüße aus http://www.braunschweig.de

                Tom

                --
                Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
                1. Danke, das das Problem mit Trennern und Zeilenumbrüchen ist jetzt gelöst!

                  Hierzu hätte ich aber noch eine Frage:

                  $var = str_replace(RET,"\n",$var);  // Umbruch wiederherstellen

                  ereg_replace(RET,"\n",$var); funktioniert genauso gut, was ist der Unterschied?

                  Vielen Dank nochmal,
                  Peter

                  1. Hallo Peter,

                    $var = str_replace(RET,"\n",$var);  // Umbruch wiederherstellen
                    ereg_replace(RET,"\n",$var); funktioniert genauso gut, was ist der Unterschied?

                    das sind die gleichen Funktionen, nur dass mit ereg_replace() reguläre Ausdrücke ersetzt werden, wodurch die Funktion dann auch (etwas) langsamer ist - wenn nur Strings ersetzt werden sollen, wie in deinem Fall, dann sollte str_replace() verwendet werden (siehe auch http://www.php.net/ereg-replace bzw. http://www.php.net/str-replace)

                    Grüße aus Nürnberg
                    Tobias

                    --
                    sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
                    (Selfcode -> http://emmanuel.dammerer.at/selfcode.html)