dedlfix: & (PHP) Speichern mit oder ohne htmlentities?

Beitrag lesen

echo $begrüßung;

[...] mal über den Code zu schauen, ob das so in Ordnung ist oder ob es hier Verbesserungen oder noch Fehler gibt:

Versuche doch mal, ob du die Magic Quotes in der Konfiguration ausschalten kannst. Wenn nicht, dann nimm am besten den Code aus dem Beispiel und schreib den an den Anfang deines Scripts. Damit werden die überflüssigen Backslashes erst einmal generell eliminiert. (Der Code kann eigentlich immer drin bleiben, dann klappts auch mit doofen Providern.)

$headline = htmlentities(trim($_POST['headline']), ENT_COMPAT, 'utf-8');

Bist du sicher, dass du HTML-Entities statt der UTF8-Zeichen in die Datenbank eintragen willst?

if(!get_magic_quotes_gpc()) {

Die Auswirkungen der M.Q. hast du ja oben schon beseitigt.

$headline = addslashes($headline);

addslashes() maskiert nur einige wenige Zeichen. Für MySQL ist mysql_real_escape_string() am besten geeignet, weil das auch den Zeichensatz der Verbindung berücksichtigt.
Wenn du generell in UTF-8 mit MySQL sprechen möchtest, kannst du das nach Öffnen der Verbindung einstellen mit:

SET NAMES utf8;
  SET CHARACTER_SET utf8;

Somit kann auch das "real" in mysql_real_escape_string() richtig arbeiten.

mysql_escape_string($headline);

Das bringt so nichts, du musst das Rückgabeergebnis verwenden, also $headline = mysql_real_escape_string($headline); etc.

$query = "INSERT INTO tabelle SET feld1=_utf8'$headline',feld2=_utf8'$quelle',feld3=_utf8'$url',feld4=_utf8'$nachricht'";

Mit der obigen Einstellung kannst du nun das _utf8 weglassen.

Ich würde mich hier der Funktion sprintf bedienen, und auch gleich das Escaping mit unterbringen, weil mir das übersichtlicher aussieht und die Variablen für eine spätere Weiterverarbeitung nicht verändert werden. Aber das ist Geschmackssache... [*]

$query = sprintf("INSERT INTO tabelle SET feld1='%s',feld2='%s',feld3='%s',feld4='%s'",
  mysql_escape_string($headline),
  mysql_escape_string($quelle),
  mysql_escape_string($url),
  mysql_escape_string($nachricht));

Oben stehender Code speichert die Texte einschließlich HTML-Entities. Ist das sinnvoll

Nein, Rohdaten in der DB sind besser, weil die DB sie dann auch richtig berücksichtigen kann (suchen, sortieren, etc.).

oder sollte ich das lassen und htmlentities() erst bei Ausgabe der Ergebnisse eines SELECT-Statements ausführen?

Ja. Die aus der DB kommenden Rohdaten sind gemäß dem Ausgabemedium zu maskieren. htmlspecialchars() reicht für HTML aus, die UTF8-Zeichen werden ja schon berücksichtigt, wenn du HTTP-Header und/oder META-Angabe richtig einstellst.

echo "$verabschiedung $name";

[*] In meinen Projekten verwende ich PEAR_DB, das kümmert sich auch um die korrekte Maskierung und Quotierung.

$query = 'INSERT INTO tabelle SET feld1=?,feld2=?,feld3=?,feld4=?';
$result =& $db->query($query, array($headline, $quelle, $url, $nachricht));