Raphi: Gästebuch formatierung...

Hallo Ich brauche eure Hilfe für mein Gästebuch.

Also ich habe mir ein Gästebuch zusammengeschrieben es funktioniert eigentlich sehr einfach. Über POST werden die eingegebenen Daten in eine Textdatei geschrieben.
Von da aus werden Sie mit diesem Script ins HTML eingefügt:

<?php
$user = $_POST["Name"];
$user = htmlentities($user);

$inhalt = $_POST["inhalt"];
$inhalt = htmlentities($inhalt);
$inhalt = str_replace("\n", "<br>", $inhalt);

$email = $_POST["EMail"];
$email = htmlentities($email);

if ($inhalt == "" or $user == "")
   {
   echo "Sie müssen das Feld "Namen"
   und "Inhalt" ausfüllen";
   }

else
   {
   $datum= date("d.m.Y H:i:s");

$eintrag="$email|$user|$datum|$inhalt";

$datei = fopen("content/gaestebuch.txt", "a");
   fwrite($datei, "\n".$eintrag);
   fclose($datei);

echo "<p>Ihr Eintrag wurde erfolgreich gespeichert</p>";
   }
?>

<br>
<div align="center">
<a href="?c=gaestebuch"><p>Zur&uuml;ck zum G&auml;stebuch</p></a>
</div>

Nun zu meinem Problem: Ich würde gerne den ausgegebenen Text bevor er im HTML angezeigt wird als mit einem <p> und somit über CSS formatieren. D.h. Bevor der Text angezeigt wird soll er speziell formatiert werden... Ist dies möglich wenn ja fände ich es toll wenn mir jemand den vollständigen Code als Antwort posten würde...

Vielen Dank schonmal im Voraus...

Raphi

  1. Lieber Raphi,

    lerne valides HTML zu schreiben. Konstruktionen wie

    <a href="?c=gaestebuch"><p>Zur&uuml;ck zum G&auml;stebuch</p></a>

    sind gegen jede Spezifikation und verursachen damit nur (Anzeige-)Probleme.

    Nun zu meinem Problem: Ich würde gerne den ausgegebenen Text bevor er im HTML angezeigt wird als mit einem <p> und somit über CSS formatieren. D.h. Bevor der Text angezeigt wird soll er speziell formatiert werden...

    Bitte sortiere Deine Gedanken und formuliere Dein Anliegen so, dass man es auf Anhieb versteht. Diese Extragedanken, die Du Dir für eine gelungene Problembeschreibung machen musst, werden Dir helfen, Dein Problem zu verstehen, um es vielleicht sogar selbst zu lösen.

    Ist dies möglich wenn ja fände ich es toll wenn mir jemand den vollständigen Code als Antwort posten würde...

    Fehlanzeige. Weder bekommst Du "vollständigen Code", noch bekommst Du von mir ein "ja" oder "nein", da ich Dein Problem aufgrund der momentanen Beschreibung nicht nachvollziehen kann.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. Hello Raphi,

    Also ich habe mir ein Gästebuch zusammengeschrieben es funktioniert eigentlich sehr einfach. Über POST werden die eingegebenen Daten in eine Textdatei geschrieben.
    Von da aus werden Sie mit diesem Script ins HTML eingefügt:

    <?php
    $user = $_POST["Name"];
    $user = htmlentities($user);

    $inhalt = $_POST["inhalt"];
    $inhalt = htmlentities($inhalt);
    $inhalt = str_replace("\n", "<br>", $inhalt);

    $email = $_POST["EMail"];
    $email = htmlentities($email);

    Um auf die Post-Parameter zugreifen zu können, brauchst Du sie nicht erst umzukopieren in "lose" Variablen. Es ist immer besser, die Quelle von Parametern zu kennen und dies z.B. auch dadurch kenntlich zu machen, dass man alle Daten aus einer Quelle auch in einer Datenstruktur (hier Array) zusammengefasst hält. Du kannst direkt mit den $_POST[]-Elementen arbeiten.

    if ($inhalt == "" or $user == "")
       {
       echo "Sie müssen das Feld "Namen"
       und "Inhalt" ausfüllen";
       }

    else
       {
       $datum= date("d.m.Y H:i:s");

    $eintrag="$email|$user|$datum|$inhalt";

    $datei = fopen("content/gaestebuch.txt", "a");
       fwrite($datei, "\n".$eintrag);
       fclose($datei);

    echo "<p>Ihr Eintrag wurde erfolgreich gespeichert</p>";
       }
    ?>

    Dann fällt mir auf, dass Du ein gemischtes Format für Deine Datenspeicherung verwendest. Das bedeutet, dass Du Formatierung und Daten gemeinsam abspeicherst. Für die weitere Arbeit mit den Daten (Suchen, Sortieren, Editieren, ...) ist das recht unpraktisch. Man versucht deshalb besser, Daten und Format solange wie möglich getrennt zu halten.

    Die Kontrolle der geposteten Daten sollte vor der Veränderung stattfinden.

    Begrüßenswert ist allerdings, dass Du htmlspecialchars() hier verwendest. Das schützt Dich vor einer XSS-Attacke. Javascript-Code würde dadurch einfach zu in HTML darzustellenden Zeichen und nicht auszuführendem Code umgewandelt werden.

    <br>
    <div align="center">
    <a href="?c=gaestebuch"><p>Zur&uuml;ck zum G&auml;stebuch</p></a>
    </div>

    Ein <p> (Blockelement) ist innerhalb eines <a> nicht erlaubt.
    http://de.selfhtml.org/html/referenz/elemente.htm
    http://de.selfhtml.org/html/referenz/elemente.htm#a
    http://de.selfhtml.org/html/referenz/elemente.htm#p

    Nun zu meinem Problem: Ich würde gerne den ausgegebenen Text bevor er im HTML angezeigt wird als mit einem <p> und somit über CSS formatieren. D.h. Bevor der Text angezeigt wird soll er speziell formatiert werden... Ist dies möglich wenn ja fände ich es toll wenn mir jemand den vollständigen Code als Antwort posten würde...

    Wenn Du die übersandten Daten in Deiner Datei alle getrennt abspeicherst vom Format (HTML, CSS), dann kannst Du sie _bei_ _der_ _Ausgabe_ gezielt in HTML verpacken und dieses dann mittels CSS formatieren.

    Zum Speichern kleinerer Datenmengen bietet PHP zwei elegante Möglichkeiten an, die ohne Datenbankmanagementsystem funktionieren:

    - serialisierte Arrays  http://de2.php.net/manual/en/function.serialize.php
      - CSV-Datein            http://de2.php.net/manual/en/function.fputcsv.php

    Das wäre dann allerdings schon ein weiterer Entwicklungsschritt. Du müsstet dich für die Verwendung dieser Speichermöglichkeiten auch mit Nebenläufigkeit beschäftigen.
    http://aktuell.de.selfhtml.org/artikel/programmiertechnik/dateisperren/

    Das ersparst Du dir in deinem Code bisher durch den Append-Mode, mit dem du die Datei zum Speichern öffnest.

    Was aber auf jeden Fall empfehlenswert wäre, ist ein eindeutiger Datensatztrenner in der Datei mit den Gästebucheinträgen, damit Du nachher auf jeden Datensatz einzeln zugreifen kannst. Dafür eignet sich in deinem Fall ein eindeutiger HTML-Kommentar, den Du an jeden Datensatz anhägnst. Dieser darf dann allerdings in den übermittelten Daten selber nicht enthalten sein (was aber einfachst schon durch htmlspecialchars() verhindert wird).

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

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

      Begrüßenswert ist allerdings, dass Du htmlspecialchars() hier verwendest.

      Ist es in diesem Fall in keinster Weise. Raphi behandelt die Daten direkt nach dem "Einlesen" mittels htmlentities() - bevor diese in eine Textdatei geschrieben werden. Das ist unsinnig und nicht zielführend.

      Es ist *IMMER* sinnvoller, Rohdaten zu speichern, und die Daten vor der *Ausgabe* als HTML mittels entsprechender Funktionen in den richtigen Kontext zu überführen.

      MfG,
      EKKi

      --
      sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
      1. Hello,

        Begrüßenswert ist allerdings, dass Du htmlspecialchars() hier verwendest.

        Ist es in diesem Fall in keinster Weise. Raphi behandelt die Daten direkt nach dem "Einlesen" mittels htmlentities() - bevor diese in eine Textdatei geschrieben werden. Das ist unsinnig und nicht zielführend.

        Es ist vollkommen in Ordnung so, wenn die Textdatei ohne weitere Maßnahmen Bestandteil des HTML-Dokumentes werden soll. Aber das habe ich ja auch ausführlich geschrieben.

        Gefährlich für die Site wäre es nur, wenn er htmlspecialchars() vollständig vergessen würde.

        Es ist *IMMER* sinnvoller, Rohdaten zu speichern,

        Habe ich doch geschrieben, das das besser[tm] wäre. was willst Du? Es würde den Aufwand aber auch gleich wieder potenzieren.

        Wenn die Anwendung sehr einfach bleiben soll, ist Raphis Vorgehensweise (grob betrachtet) durchaus OK so.

        Auf Feldtrenner und Datensatztrenner und dass diese Zeichen(ketten) in den Daten nicht enthalten sein sollten, sind wir im Thread ja auch schon eingegangen.

        Das nächste Problem, was Raphi begegnen wird, ist die Anzeigereihenfolge der Einträge. Er kommen bei Fortsetzung seiner Entwicklung sowieso immer wieder Fallstricke dazu und er dadurch irgendwann an die kritischen Stellen :-)

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

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

    Also ich habe mir ein Gästebuch zusammengeschrieben es funktioniert eigentlich sehr einfach.

    Zu einfach, denn damit funktioniert es nicht in jedem Fall fehlerfrei.

    $user = $_POST["Name"];

    Unnötiges Umkopieren. Du verschleierst nur die Herkunft der Daten und erhöhst die Komplexität und potientiellen Fehlerquellen durch das Einführen neuer Variablen.

    $user = htmlentities($user);

    HTML-Entitys mögen zwar für deine irgendwann spätere Ausgabe sinnvoll sein, aber für deine Gästebuchdaten sind sie zunächst unnötig und verhindern auch nicht, ...

    $eintrag="$email|$user|$datum|$inhalt";

    ... dass l|ebe User Sonderze|chen e|ngeben, d|e dann de|n Format durche|nanderbr|ngen. Du müsstest dir also hier nur Gedangen machen, wie du den | entschärfst. Den Zeilenumbruch hast du zwar schon durch ein <br> ausgetauscht, doch das ist nicht die beste Lösung. Behandle deine Daten erst dann für das entsprechenden Ausgabemedium, wenn sie wirklich zu diesem Medium ausgegeben werden. Dann musst du auch nicht die Übersicht behalten, welche Daten schon behandelt wurden, und welchen das noch unbedingt bevorstehen muss.

    Ich würde gerne den ausgegebenen Text bevor er im HTML angezeigt wird als mit einem <p> und somit über CSS formatieren.

    Was hindert dich konkret, ein <p> vorher und ein </p> nachher auszugeben?

    Zu den anderen Punkten hat Tom ja schon etwas geschrieben.

    Lo!