htmlentities() + MySQL und Firefox 3.0.3 = Fehler!?

fRagiLeMOD

Mitglied
Hallo liebe Community,

ich habe seit ein paar Wochen Probleme mit dem PHP Befehl htmlentities() im Firefox. Und zwar habe ich vor einem Jahr mal eine einfache kleine Funktion gebastelt, die die Daten fehlerfrei und umgewandelt als HTML in die MySQL Datenbank eintragen soll. Funktionierte bislang in allen meinen Scripten wunderbar (ich benutze sie überall) und das tut sie auch in allen anderen Browsern immernoch (IE, Avant, Opera, Safari, Google Chrome...), aber momentan eben leider nicht mehr im Firefox.

PHP:
function dbSecurity($value)
{
  $value = mysql_real_escape_string(stripslashes(trim(htmlentities($value))));
  return $value;
}

Wenn ich in einem Formular nun z.B. folgendes eingebe: Weblösungen für jedermann
Und dieses nun abschicke und mit der entsprechenden Query in die Datenbank eintrage (Beispiel):

PHP:
mysql_query("insert into tabelle (data) values ('".dbSecurity($_REQUEST['data'])."')", $dbCon);

Dann ist in der Tabelle im entsprechenden Feld folgendes eingetragen: Weblösungen für jedermann

Und die Ausgabe per HTML ist: Weblösungen für jedermann

Wenn ich das Selbe beispielsweise mit dem IE mache, ist in der Tabelle in dem Feld alles korrekt eingetragen: Weblösungen für jedermann

Und die Ausgabe im Browser ist die richtige: Weblösungen für jedermann

Mache ich etwas falsch, oder ist das ein Bug vom FIrefox 3.0.3? Hat jemand das selbe Problem? Lösungsansätze (nicht mit htmlspecialchars(), da dies ja nicht alles umwandelt)?

Viele Grüße,
Jens
 
Welche Zeichenkodierung verwendest du? Dem Genannten nach zu urteilen, ist es UTF-8. Dort bräuchtest du htmlentities() gar nicht, da UTF-8 sämtliche Unicode-Zeichen kodieren kann. Und für die HTML-Metazeichen würde htmlspecialchars() reichen.

Um die Daten für eine MySQL-Abfrage vorzubereiten, reicht mysql_real_escape_string() alleine allerdings völlig aus. Erst beim Ausgeben der Daten in einem HTML-Dokument wird htmlspecialchars() benötigt.
 
In der Datenbank nutze ich für sämtliche Felder den Standard latin1_general_ci. Sollte ich das besser auf utf8_bin umstellen? In meinem Adminbereich habe ich den Zeichensatz im Template (meta -> content-type) auch nicht definiert. Liegt hier vll. der Fehler?
 
Der Fehler wird in diesem Fall wohl sein, dass die Daten in der falschen Kodierung vorliegen. Das lässt sich zwar ändern (siehe utf8_decode() für UTF-8 ? ISO 8859-1). Doch damit würdest du nur die Symptome behandeln, die Ursache, nämlich die Quelle der Daten, ist damit nicht behoben. Wo kommen denn die Daten her?
 
Die Daten werden ausschließlich per Formulare im Administrationsbereich oder z.B. bei einer Registrierung eingegeben, also immer per $_REQUEST herangeholt und in die DB eingetragen.
 
Dann musst du dort ansetzen, um eine einheitliche Kodierung zu gewährleisten. Allgemein hängt nämlich die vom Client bei Anfragen verwendete Zeichenkodierung von der des HTML-Dokuments ab, von dem die Anfrage ausgeht. Zusätzlich kann im Formular eine abweichende Zeichenkodierung bestimmt werden (siehe accept-charset-Attribut).
 
Ich habe es so gelöst:
Im Template im Head bereich folgenden Code eingefügt:
HTML:
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

Allen Formularen folgendes Attribut hinzugefügt:
HTML:
<form accept-charset="utf-8" ... >

Die Funktion erweitert mit utf8_decode() und htmlentities() mit htmlspecialchars() ersetzt:
PHP:
function dbSecurity($value)
{
  $value = mysql_real_escape_string(stripslashes(trim(utf8_decode(htmlspecialchars($value)))));
  return $value;
}
Ich wollte gerne HTML Code in der Datenbank haben. Deshalb htmlspecialchars().
Wenn ich utf8_encode() benutze, wird komischerweise wieder alles falsch dargestellt - warum

Und schließlich in der Datenbank alle Textfelder als utf8_bin Kollation deklariert.

Umlaute sind zwar nun reine UTF8 Zeichen und kein HTML, aber nun gibt es keine Darstellungsfehler mehr.
 
Zuletzt bearbeitet:
Hast du eigentlich verstanden, was ich geschrieben hab?
Du solltest eine einheitliche Kodierung verwenden (also entweder UTF-8 oder ISO 8859-1). Auch reicht für MySQL-Abfragen die mysql_real_escape_string()-Funktion allein. Und für HTML-Ausgaben (und zwar genau erst dann!) die htmlspecialchars()-Funktion.
 
Zurück