MySQL erstickt bei geschweiften (intelligenten) Anführungszeichen

8

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.

    
DisgruntledGoat 23.08.2009, 15:56
quelle

2 Antworten

7

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.

    
chaos 23.08.2009, 16:10
quelle
7

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 73

Daher lautet die Frage: Füttern Sie den mysql-Server etwas in einer "falschen" Kodierung?
Jede Verbindung hat einen Verbindungszeichensatz und der mysql-Server erwartet, dass Ihr Client (php-Skript) Daten sendet, die in diesem Zeichensatz codiert sind. Mit

können Sie herausfinden, was der Verbindungszeichensatz ist %Vor%

wie 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?

    
VolkerK 23.08.2009 16:37
quelle

Tags und Links