Constantin Kiesling: MySQL - Gästebuch

Hallo liebe Selfhtml-Community!

Ich hab ein kleines Problem´und wäre über Hilfe sehr froh... Folgendes:
Ich habe mir mit PHP und MySql ein kleines Gästebuch erstellt. Ich wollte, dass Zeilenumbrüche in den einzelnen Kommentaren erlaubt sind, also hab ich folgendes gemacht: Im Script, wo ich die Daten an die Datenbank übergebe, habe ich nun zuerst alles mit nl2br(); formatiert (damit die Zeilenumbrüche sozusagen erlaubt sind). Wenn ich dann über PHPMyAdmin die Datenbankeinträge ansehe, werden auch die Zeilenumbrüche gezeigt - funktioniert also. Aber wenn ich die Einträge mit der while-Schleife auf der normalen Website sichtbar mache, dann gibt's keine Umbrüche....

Frage: Muss ich etwa auch beim wiedergeben der Datenbank in der while Schleife nochmals nl2br(); anwenden? Oder woran könnte es sonst liegen?

lG, Consti

  1. Aloha!

    Frage: Muss ich etwa auch beim wiedergeben der Datenbank in der while Schleife nochmals nl2br(); anwenden? Oder woran könnte es sonst liegen?

    Deine Vorgehensweise klingt zwar nicht falsch, aber ich würde die Zeilenumbrüche erst bei der Ausgabe des Gästebuches umwandeln, nicht beim Speichern. Damit hast du größere Freiheiten, z.B. einen Adminbereich zu gestalten.

    Folgende Vorgehensweise ist schlau:

    <textarea> -> add_slashes() bzw. magic_quotes -> Speichern in DB

    Lesen aus DB -> htmlspecialchars() -> nl2br() -> Ausgabe als HTML

    Lesen aus DB -> htmlspecialchars() -> Ausgabe in Textarea

    Mit diesem Vorgehen hälst du dir die Möglichkeit offen, den Inhalt der Datenbank beliebig in Textareas zu bearbeiten.

    nl2br() dürfte bekannt sein.
    htmlspecialchars() wandelt die HTML-Sonderzeichen <, >, & und " um in $lt;, >, & und " - damit kann in der Textarea kein HTML-Code mehr eingegeben werden, sondern der Text wird 1:1 so wie hier im Forum wiedergegeben. Das schützt dich vor Crackern, die andernfalls böse Javascripte einschleusen könnten.

    - Sven Rautenberg

    1. Hallo nochmal!

      Deine Vorgehensweise klingt zwar nicht falsch, aber ich würde die Zeilenumbrüche erst bei der Ausgabe des Gästebuches umwandeln, nicht beim Speichern. Damit hast du größere Freiheiten, z.B. einen Adminbereich zu gestalten.

      Folgende Vorgehensweise ist schlau:

      <textarea> -> add_slashes() bzw. magic_quotes -> Speichern in DB

      Lesen aus DB -> htmlspecialchars() -> nl2br() -> Ausgabe als HTML

      Lesen aus DB -> htmlspecialchars() -> Ausgabe in Textarea

      Mit diesem Vorgehen hälst du dir die Möglichkeit offen, den Inhalt der Datenbank beliebig in Textareas zu bearbeiten.

      nl2br() dürfte bekannt sein.
      htmlspecialchars() wandelt die HTML-Sonderzeichen <, >, & und " um in $lt;, >, & und " - damit kann in der Textarea kein HTML-Code mehr eingegeben werden, sondern der Text wird 1:1 so wie hier im Forum wiedergegeben. Das schützt dich vor Crackern, die andernfalls böse Javascripte einschleusen könnten.

      Okay... das klingt sehr gut, danke! Für was ist denn aber add_slashes() bzw. magic_quotes?

      Eine ganz andere Frage: Kann ich irgendwie z.B. mit einer if Bedingung abfragen, ob in der Datenbanktabelle überhaupt Datensätze vorhanden sind und dann eventuell eine Meldung geben falls nicht...?

      lG, Consti

      1. Aloha!

        Okay... das klingt sehr gut, danke! Für was ist denn aber add_slashes() bzw. magic_quotes?

        Das schützt deine Datenbank!

        Wenn als Text folgender String kommt:
        Wie geht's?

        Und du das in den SQL-String einbaust:
        $sqlinsert="INSERT INTO tabelle (text) VALUES ('$textarea')";
        dann wird folgender String daraus:
        $sqlinsert="INSERT INTO tabelle (text) VALUES ('Wie geht's?')";
        Und du hast ein Anführungszeichenproblem hier ----------^

        Das Anführungszeichen muss geschützt werden, indem ein Backslash davor gesetzt wird. Genau das erledigt add_slashes() als Funktion. Das ist aber meist unnötig, wenn die Option "magic_quotes" aktiv ist, dann setzt PHP die Backslashes automatisch vor jedes ' und ".

        Eine ganz andere Frage: Kann ich irgendwie z.B. mit einer if Bedingung abfragen, ob in der Datenbanktabelle überhaupt Datensätze vorhanden sind und dann eventuell eine Meldung geben falls nicht...?

        Klar. Dazu musst du die Datenbank abfragen und etwas SELECTieren. Die Anzahl der Ergebnisse liefert die Funktion mysql_num_rows(). Das Ergebnis wird 0 sein, wenn nichts gefunden wurde, und -1, wenn ein Fehler aufgetreten ist.

        - Sven Rautenberg

        1. Hallo!

          Danke für deine nette Hilfe - jetzt kenne ich mich aus! =)

          CU

        2. Achja... Mist, mir ist nochwas eingefallen *grml*

          Kann man sich irgendwie vor "Designsprengern" schützen, die mit zu langen Zeichenketten "MMMMMMMMMMMMMMMMMMMMMMMMMMM......" alles horizontal in die Länge ziehen?

          1. Aloha!

            Kann man sich irgendwie vor "Designsprengern" schützen, die mit zu langen Zeichenketten "MMMMMMMMMMMMMMMMMMMMMMMMMMM......" alles horizontal in die Länge ziehen?

            Klar kann man das. Du mußt halt einfach die Länge eines jeden Wortes feststellen und ggf. eingreifen.

            Spontan habe ich folgende PHP-Funktionen gefunden:
            chunk_split() http://www.php.net/manual/de/function.chunk-split.php
            Damit kriegst du einen String (aus der Textarea) in gleichlange Stücke zerlegt. Ist für die Anwendung auf menschlichen Text unpraktisch, aber wäre die harte Methode. Du kannst die maximale Länge einer "Zeile" definieren, und auch, welches Zeichen dann eingesetzt wird. Beispielsweise wäre ein Leerzeichen nicht verkehrt.

            Schöner aber wird wordwrap() sein: http://www.php.net/manual/de/function.wordwrap.php.
            Die Funktion tut zumindest in etwas das, was du willst. Lies die zusätzlichen Userkommentare, die sind an dieser Stelle wirklich hilfreich und gut.

            Du siehst: Dieses Problem ist nicht so 100% leicht mit einer vorhandenen Funktion zu lösen - vor allem deshalb, weil es sehr vielfältige Anforderungen gibt, die eine allgemeine Funktion kaum immer befriedigend lösen kann.

            - Sven Rautenberg