Ich füge einige Daten aus einem Formular in eine Datenbank ein. Ich verwende addslashes
, um den Text zu umgehen (probiere mysql_real_escape_string
mit demselben Ergebnis aus).
Reguläre Anführungszeichen werden mit Escapezeichen versehen, einige andere Anführungszeichen jedoch nicht. Zum Beispiel die Zeichenfolge:
Homers Blut wird zur geheimen Zutat in Moes neuem Bier.
wird umgewandelt in:
Homers Blut wird zur geheimen Zutat in Moes neuem Bier.
Ich dachte nicht, dass das geschweifte Zitat ohne Bedeutung wäre, aber nur dieser Text wird in die Datenbank eingefügt:
Homers Blut wird zur geheimen Zutat in Moe
So denkt PHP, dass das geschweifte Zitat in Ordnung ist, aber MySQL verliert die Zeichenfolge. MySQL gibt jedoch keine Fehler.
Ich würde nach einer Diskrepanz zwischen der in Ihrer Webschnittstelle verwendeten Zeichencodierung und der auf Datenbankebene verwendeten suchen. Wenn Ihre Webschnittstelle beispielsweise UTF-8 verwendet und Ihre Datenbank die Standard-MySQL-Kodierung von latin1
verwendet, müssen Sie Ihre Tabellen mit DEFAULT CHARSET=utf8
einrichten.
Benutze mysql_real_escape_string()
oder mysqli, übrigens. addslashes()
ist NICHT angemessener Schutz vor SQL-Injection.
Das 'in Moe's' ist das einzige Zeichen in Ihrer Beispielzeichenfolge, das nicht gültig wäre, wenn diese Zeichenfolge latin1-codiert ist, aber Ihr mysql-Server utf8 erwartet.
Einfache Demonstration:
%Vor%druckt
len = 5 4D 6F 65 92 73 len = 6 4D 6F 65C C2 92 73Daher lautet die Frage: Füttern Sie den mysql-Server etwas in einer "falschen" Kodierung?
können Sie herausfinden, was der Verbindungszeichensatz ist %Vor%
Jede Verbindung hat einen Verbindungszeichensatz und der mysql-Server erwartet, dass Ihr Client (php-Skript) Daten sendet, die in diesem Zeichensatz codiert sind. Mitwie in
%Vor%Dies sollte etwas wie
drucken %Vor%und
character_set_connection, utf8
zeigen an, dass "mein" Verbindungszeichensatz utf8 ist, d. h. der mysql-Server erwartet utf8-codierte Zeichen vom Client (php). Was ist "dein" Verbindungszeichensatz?Sehen Sie sich dann die tatsächliche Kodierung Ihrer Parameter-Zeichenfolge an, d. h. wenn Sie
hatten %Vor%ersetzen Sie das durch
%Vor%und überprüfen Sie, wie die tatsächliche Codierung Ihrer Eingabe-Zeichenfolge ist. Wird 92 oder C2 92 gedruckt?
Tags und Links quotes php mysql smart-quotes