dedlfix: Zeichenkodierung zwischen PHP und MySQL

Beitrag lesen

echo $begrüßung;

Ich mache folgenden Insert mittels PDO:
insert into table (text) values ('1:0 Ä')

Wie genau machst du das? Ist dir die Sonderbedeutung des : im Zusammenhang mit Prepared Statements in PDO bekannt?

Die Daten sollten in UTF-8 vorliegen.

Prüfe sowas bitte nach. Kontrollausgaben mittels var_dump() zeigen schonmal eine String-Länge in Bytes an. Bei einem UTF-8-Ä wären das 2 Bytes. Mit bin2hex() kann man die Bytewerte direkt kontrollieren.

Aber nach dem Connecten und vor dem Insert setze ich die folgenden Anweisung an die Datenbank ab:
"SET NAMES utf8"
"SET CHARACTER SET utf8"

Beide Anweisungen setzen die gleichen drei Werte, tun dies jedoch auf unterschiedliche Weise. Die zuletzt ausgeführte Anweisung überschreibt das, was die erste geamcht hat. Ich nehme an, du willst nur SET NAMES ausführen und bist dir nicht über die Auswirkungen von SET CHARACTER SET bewusst. (Connection Character Sets and Collations)

Das Problem, dass ":zahl", also z.B. ":3", zu einem Fragezeichen konvertiert wird, tritt auch auf, wenn ich einen HTML-Link im String habe:

Ich tippe auf Prepared Statements.

Was vielleicht noch wichtig ist in Verbindung mit dem Link: Der String ist mit magic_quotes escaped. Ich habe versucht mysql_real_escape_string() zu verwenden, aber da erhalte ich einen leere String zurück.

Wie sieht es mit Fehlermeldungen aus? Steht error_reporting auf E_ALL (und display_errors auf on)? mysql_real_escape_string() benötigt eine mit mysql_connect() hergestellte Verbindung bzw. erstellt sie sich automatisch selbst. Wenn du PDO verwendest solltest du auch nur Funktionen von PDO verwenden und nicht Dinge von anderen Extensions. PDO::quote() übernimmt das Maskieren _und_ das Quotieren. Noch besser wäre gleich das korrekte Verwenden von Prepared Statements. Da erübrigt sich das Quotieren und Maskieren (Magic Quotes ausschalten, die werden nicht benötigt und sind kontraproduktiv).

Wenn ich mit PHPs stripslashes()-Funktion alle Slashes entferne, tritt das Problem übrigens nicht mehr auf, aber das ist natürlich alles andere als sicher um es in einer SQL-Anweisung zu verwenden.

Magic Quotes sind nicht für SQL-Anweisungen geeignet. Ach? Ja. Nicht alle Systeme haben die gleichen Quotier- und Maskier-Regeln. Magic Quotes hilft vielleicht bei MySQL, doch wirkt es auf alle Eingabedaten, nicht nur auf die Daten, die zur Datenbank gesendet werden. Und aus beispielsweise Dateien kommende Daten wirkt es gar nicht.

Noch eine Kleinigkeit: Wenn ich einen Text mit mehreren Absätzen (zwei Zeilenumbrüche gelten für mich jetzt mal als neuer Absatz) habe, tritt das Problem "1:0" -> "1?" IMMER NUR im ersten Absatz auf.

Eins nach dem anderen, vielleicht klärt sich dieses Problem, wenn du die obigen geklärt hast.

echo "$verabschiedung $name";