2013-02-10 16 views
6

Verwirrt über Escape-Zeichenfolge und wie es in der DatenbankMySQL PHP Escape String '' - Warum wird es nicht in der Datenbank mit dem Backslash gespeichert?

In meinem MySQL Anruf gespeichert ist, ich eine Zeichenfolge mit einem Backslash:

UPDATE `TABLE` SET `PERSONAL_BELONGINGS` = 'Tom\'s things' 

Aber wenn ich in der phpAdmin zu finden - wurde der Wert gespeichert wie folgt:

|Tom's things| 

Warum wird der Backslash nicht in der Datenbank gespeichert? Dies verursacht Probleme, wenn ich diesen Wert in Javascript lesen und dann versuchen, es herumzugeben - meine JavaScript-Strings werden beendet. Deshalb bin ich dem Charakter zunächst entkommen.

Warum entfernt MySQL den umgekehrten Schrägstrich, bevor er in der Datenbank gespeichert wird?

Wenn nicht speichern in der Datenbank mit dem '\' - Was ist der beste Weg, um damit umzugehen, wie Sie es wieder an das Javascript als Zeichenfolge übergeben? Um es wieder zu entgehen, wenn es als String an Javascript übergeben wird?

+3

'\ '' ist die Escape-Sequenz von '' '. Verwenden Sie '\\\' 'für' \ ''. –

+3

Weil niemand diesen Schrägstrich in der Datenbank brauchte? –

+0

Ja ... Ich verstehe, dass das '\' in der Datenbank nicht benötigt wird - ich schätze, ich versuche nur zu verstehen, wie ich am besten mit dem offenen Text umgehen kann - damit ich es beim Speichern wieder verwenden kann Daten werden an Javascript zurückgegeben - ohne meine JavaScript-Strings zu brechen. – KDawg

Antwort

8

Lassen Sie mich damit beginnen, dass Sie wirklich nicht wirklich Daten in einem bestimmten Escape-Format in der Datenbank speichern sollten, Sie werden es später bereuen, wenn Sie es in einem anderen Format extrahieren oder die Daten aus irgendeinem Grund später durchsuchen müssen. Das Format, das Sie jetzt speichern, sieht gut aus und das Hinzufügen von umgekehrten Schrägstrichen für Javascript wird besser im Code ausgeführt, wenn Sie die Daten an das tatsächliche Javascript übergeben.

Aus diesem Grund verhält es sich derzeit so, wie es tut;

In der Zeichenfolge 'Tom\'s things' ist \' ein character escape sequence und wirklich nur lassen MySQL verwendet wird, verstehen, wie die SQL-Zeichenfolge zu analysieren, ist es nie gespeichert wie in der Datenbank ist.

Der Grund, warum Sie das Zeichen ' in der SQL-Anweisung, mit der Sie beginnen, umgehen, ist, dass MySQL ansonsten nicht wissen kann, dass die Zeichenfolge nicht mit dem einfachen Anführungszeichen nach 'Tom endet.

Wenn Sie vorgefertigte MySQLi oder PDO-Anweisungen verwenden, anstatt Ihre SQL-Anweisungen selbst zu erstellen, können Sie mit MySQL Werte ganz unverändert speichern, ohne dass Sie jemals etwas entkommen müssen. Dies ist definitiv die bevorzugte Option, da die MySQL-API, die vorbereitete Anweisungen nicht unterstützt, ohnehin veraltet ist.

+0

OK -Danke, ich verstehe. Wenn es nicht in der Datenbank mit dem '\' gespeichert wird - Was ist der beste Weg, um damit umzugehen, wenn Sie es als Zeichenfolge an das Javascript zurückgeben? Um es wieder zu entgehen, wenn es als String an Javascript übergeben wird? – KDawg

+1

Ja, ich würde sagen, das Übersetzen in das Format, das Sie brauchen, ist am besten, wenn Sie es übergeben, was es braucht (zB wenn Sie es an das Javascript weitergeben) Wenn Sie JSON wählen, ist ein besseres Format bei Einige spätere Zeit, zum Beispiel, müssen Sie nicht viele Backslashes entfernen, weil sie in der Datenbank sind. –

+0

Super - danke für deine Hilfe und die Erklärung :) – KDawg

3

Der Backslash wird als "escape character" behandelt. Wenn kein Backslash vorhanden wäre, würde die Zeichenfolge bei Tom enden, aber die verbleibenden s things würden einen Syntaxfehler verursachen.

Die \ weist MySQL an, die Escape-Zeichenfolge ' nicht als Zeichenfolgebegrenzer zu behandeln, sondern weiterzugehen, bis die nächste nicht gesicherte Nachricht ' gefunden wird.

Dieses Escapezeichen wird nur für die Abfragezwecke verwendet und nicht als Teil der Zeichenfolge behandelt, die Sie aktualisieren möchten.

Wie Alvin in Kommentaren vorgeschlagen, wenn Sie den umgekehrten Schrägstrich in Ihrer Datenbank behalten möchten, müssen Sie ihn hinzufügen, indem Sie einen anderen umgekehrten Schrägstrich, d. H. \\ hinzufügen. Dies würde Ihre Abfrage aussehen lassen wie:

UPDATE `TABLE` SET `PERSONAL_BELONGINGS` = 'Tom\\\'s things' 

Und die Daten in der Datenbank aussehen würde:

|Tom\'s things| 

Sie können mehr über Stringliterale lesen und zu entkommen Sonderzeichen in MySQL Manual

Es lohnt Beachten Sie jedoch, dass das Speichern einer bereits entsprungenen Zeichenfolge in der Datenbank eine schlechte Übung ist. Sie sollten auf Sonderzeichen in Ihrem Code achten.

+0

Danke. Ist es das Beste, es zu behalten oder nicht? Ich will nur nicht, dass meine JavaScript-Strings beendet werden. Leute geben Freitext in das Formular ein. Ich möchte nur sicherstellen, dass ich meine JavaScript-Strings nicht aufbringe. Vielen Dank. – KDawg

+2

Nein, behalten Sie die umgekehrten Schrägstriche nicht in der Datenbank. Ihr PHP/JavaScript sollte darauf achten, die Daten bei Bedarf zu entfernen. –

+0

OK - also sprichst du es wieder aus, wenn du es mit PHP/JavaScript aus der Datenbank liest? Ja? – KDawg

1

Da der Backslash in MySQL ein Escape-Zeichen ist (genau wie in PHP). Sie müssen dem umgekehrten Schrägstrich selbst entkommen, um ihn zu speichern - also würde \\ einen einzelnen Backslash speichern. \\\' würde einen umgekehrten Schrägstrich gefolgt von einem Anführungszeichen speichern, da der erste umgekehrte Schrägstrich das zweite entkoppelt und das dritte das Anführungszeichen entkoppelt. Diese

1

verursacht Probleme, wenn ich diesen Wert in Javascript lesen

Sicher diesenicht.
Dann sperren Sie Ihr Geld in einem Safe, können Sie einen sicheren Hersteller beschuldigen, wenn es ausgeraubt wird.
Aber sobald Sie Ihr Geld zurückbekommen und es wurde gestohlen - Sie können nicht immer noch einen Safe dafür beschuldigen.
Es ist Ihr Verantwortung jetzt.

Also, wenn Sie Ihre Daten für JavaScript maskiert benötigen - nur entkommen.
Aber natürlich nicht mit mysql _escape_string()

+0

Ah ... ich sehe -sehr gut. Vielen Dank :) – KDawg

Verwandte Themen