2 Stimmen

Mit ExtJS kodierter String JSON kann nicht mit json_decode in PHP dekodiert werden

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X