Ich möchte Daten aus einem Eingabefeld in einer Datenbank speichern. Wenn der Benutzer jedoch beschließt, einige Backslashes oder Anführungszeichen einzugeben, bin ich am Ende.
Ich verwende den folgenden Code auf der Client-Seite. Der Wert von mystring wird in der Tat aus einem Eingabefeld gelesen.
mydata = Ext.encode({
mystring : "foo '\' bar ' \0x00\""
});
Ext.Ajax.request({
url: '/test.php',
params: { data: mydata }
});
Auf dem Server, print_r($_POST)
gibt mir
array(
['data'] => '{"mystring":"foo '' bar ' \u0000x00\""}'
)
Ich habe also den Backslash nach foo verloren, und die \0x
wurde \u00
y
var_dump(json_decode($_POST['data'])
scheitert und kehrt zurück
NULL
In einem anderen Fall, wenn der Benutzer Anführungszeichen verwendet, erhalte ich
mydata = Ext.encode({
{"mystring":"foo '\"' bar '"}
});
und ich lande auf der PHP-Seite mit $_POST
array(
['data'] => '{"mystring":"foo '"' bar '"}'
)
was ebenfalls keine gültige Eingabe für json_decode() ist.
Ich möchte die Benutzereingabe wörtlich nehmen. Ich möchte meine Datenbank-Wrapper kümmern sich um die Escape-Sachen vor dem INSERT-Befehl, aber wie kann ich senden beliebige Zeichenfolgen, möglicherweise mit einer beliebigen Menge von Schrägstrichen, Backslashes, doppelte und einfache Anführungszeichen sicher zu meinem PHP-Skript und json_decode es erfolgreich?
Ich habe bereits über die base64-Kodierung nachgedacht, aber das ist keine gute Option.
参照 http://dev.sencha.com/deploy/dev/docs/?class=Ext.util.JSON für die Dokumentation.
Bearbeiten:
Die Daten werden aus dem Speicher eines Ext.grid.EditorGridPanel myGrid gelesen. Das ganze Skript hat ca. 2.500 LoC, daher poste ich hier nur einen Auszug. Ich habe auch einige Variablennamen geändert, um den ganzen Kram lesbarer zu machen.
var modRec = myGrid.getStore().getModifiedRecords();
var data = new Array();
var len = modRec.length - 1;
for (f = len; f > -1; --f) {
var a = {};
var changes = modRec[f].getChanges();
for (var name in changes) {
if ('function' == typeof changes[name]) {
continue;
}
a[name] = changes[name];
}
data.push(a);
}
Ext.Ajax.request({
url: '/test.php',
params: { Ext.encode(data) }
});
Das Ergebnis ist dasselbe wie oben. Wenn ein Benutzer ein doppeltes Anführungszeichen in das Editorfeld des Rasterzellen-Editors eingibt, das ein Ext.form.TextField ist, wird die Zeichenfolge nicht korrekt kodiert und dekodiert.