Bevan: & MySQL: Sonderzeichen in Formular

Hallo!

Ich bin dabei ein kleines Gästebuch zu schreiben, habe jetzt aber ein Problem mit Umlauten. Und zwar ist meine Seite mit UTF-8 codiert, und das soll eigentlich auch so sein (außer es geht absolut nicht anders).
Ich habe auf der Seite ein Formular, die darin eingegebenen Daten gehen an ein PHP-Script, das die Daten in eine MySQL-Datenbank einträgt. Später werden sie wieder ausgelesen und sollen auf dem Bildschirm ausgegeben werden. Bei sehr vielen Umlauten werden aber unleserliche Zeichen angezeigt.
Zu der Problematik gibt es hier im Forum ein paar Fragen aber ich konnte nichts finden, was bei mir das Problem behoben konnte.

Mein Formular sieht folgendermaßen aus:

<form action="Gaestebuch.php" method="post" accept-charset="utf-8">
              <ul style="list-style: none">
                <li>Name *:</li>
                <li><input type="text" size="15" maxlength="15" name="name" /></li>
                <li>E-Mail:</li>
                <li><input type="text" size="25" maxlength="25" name="mail" /></li>
                <li>Text *:</li>
                <li><textarea cols="50" rows="10" name="text" ></textarea></li>
                <li><input type="submit" name="action" value="Eintragen" />
                  <input type="reset" value="L&ouml;schen" /></li>
                <li>(mit * markierte Felder sind Pflicht)</li>
              </ul>
            </form>

In den PHP-Code habe ich folgendes geschrieben:

$text = trim ($text);
$name = trim ($name);
$text = htmlentities ($text);
$name = htmlentities ($name);
$text = str_replace ("\r\n" , "<br >\r\n" , $text);

dann wird das ganze eingetragen durch:

INSERT INTO mgb_daten (name , mail , datum , text) VALUES ('$name' , '$mail' , '$datum' , '$text')

In der Datenbank gibt es folgende Felder:

  • name (tinytext)
  • mail (tinytext)
  • datum (varchar)
  • text (longtext)

Apache: 1.3.31
PHP: 4.3.10
MySQL: 4.0.24
phpinfo(): http://www.young-forum.de/selfhtml.php

Habt ihr eine Idee, wie ich es schaffe, dass so gut wie alle (auf jeden Fall deutsche Umlaute und €-Zeichen etc.) Zeichen korrekt dargestellt werden? Hier im Forum z.B. geht es ja auch ;-)

Michael

PS: Ich kenne mich mit MySQL nicht besonders gut aus, also kann es vielleicht auch an den Typen liegen, die ich den jeweiligen Feldern gegeben habe?

  1. echo $begrueszung;

    <form action="Gaestebuch.php" method="post" accept-charset="utf-8">

    Du nimmst hier Daten UTF-8-kodiert entgegen. PHP arbeitet intern aber (immer noch) nicht mit UTF-8/Unicode.

    $text = htmlentities ($text);
    $name = htmlentities ($name);

    deswegen interpretiert es hier die Zeichen als ISO-8859-1. Im Manual (englische Ausgabe) zu htmlentities ist der dritte Parameter charset beschrieben, den du hier verwenden solltest.

    Außerdem empfehlenswert: http://dev.mysql.com/tech-resources/articles/4.1/unicode.html Dieser Artikel bezieht sich zwar auf Unicode-Behandlung in MySQL 4.1, gibt aber auch einige allgemeine Erläuterungen zum Thema.

    Das Abspeichern der Daten in für das Ausgabemedium angepasster Form ist generell nicht empfehlenswert. Will man später die Daten an ein anderes Medium ausgeben muss man sie erst wieder zurückwandeln um sie dann für das neue Medium zu kodieren.
    Allerdings dürfte der Wunsch, Gästebuchdaten an ein anderes Medium auszugeben, wahrscheinlich nie auftauchen. Es entspricht zwar nicht den Prinzipien der sauberen Datenverarbeitung, schadet aber nicht weiter in deinem Fall.

    echo "$verabschiedung $name";

    1. Hallo!

      <form action="Gaestebuch.php" method="post" accept-charset="utf-8">

      Du nimmst hier Daten UTF-8-kodiert entgegen. PHP arbeitet intern aber (immer noch) nicht mit UTF-8/Unicode.

      Sollte ich das also ändern?

      Es klappt jetzt jedenfalls! Habe bei dem htmlentities() das utf-8 angegegeben und anscheinend war das der Fehler :-)

      Michael

      1. Hallo,

        <form action="Gaestebuch.php" method="post" accept-charset="utf-8">

        Du nimmst hier Daten UTF-8-kodiert entgegen. PHP arbeitet intern aber (immer noch) nicht mit UTF-8/Unicode.
        Sollte ich das also ändern?

        Mit PHP wirst Du dabei noch die geringsten Probleme haben, wie Du ja jetzt gesehen hast. Da haben wahrscheinlich die meisten Provider schon die neueste Version installiert, die dann auch UTF-8 unterstützt. Probleme kannst Du aber mit MySQL bekommen. Dort wird UTF-8 auch erst seit Version 4.1 unterstützt und _hierfür_ haben die meisten Provider eben diese Version nicht installiert, weil sich die Lizensierungsbestimmungen bei MySQL geändert haben.

        Die Probleme äußern sich solange nicht, wie Du MySQL nur als reinen Speicher verwendest, sie treten aber auf, wenn Du z.B. unabhängig von Groß- und Kleinschreibung nach Zeichen außerhalb von US-ASCII in WHERE-Klauseln filtern bzw. in ORDER BY-Klausel sortieren willst. Ohne UTF-8 Unterstützung sind das UTF-8-"ä" für MySQL eben _zwei_ Zeichen und das UTF-8-"Ä" sind zwei ganz andere Zeichen.

        viele Grüße

        Axel

        1. Hm, ok. Also meine derzeitige Datenbanknutzung funktioniert einwandfrei. Ich benutze einmal ORDER BY aber das für das Feld date, das bei mir von PHP und nicht vom Formular gefüllt wird.

          Also danke auf jeden Fall für die Hilfe, jetzt geht wirklich JEDES Sonderzeichen :-)

          Michael