0

フィールドと任意の文字を入力できるテキスト領域を含むフォームがあります。フォームは何度もリサイクルされているため、フォームを送信することはできません。フォームの値は連想配列に格納されています。

<form name='Theform'>

    <input type="text" id="VISITOR_DETAILS_NAME" value="Joe">
    <input type="text" id="VISITOR_DETAILS_SIZE" value="Large">
    <textarea id='VISITOR_DETAILS_INFO'>
       User can enter anything here including double " and single ' quotes
    </textarea>
<input type="hidden" name="package" id="package" value="" />

</form>

テキスト領域の値は、他のフォーム値とともに JavaScript 配列に格納されます。

myArray[0]['VISITOR_DETAILS_NAME'] = document.getElementById('VISITOR_DETAILS_NAME').value;
myArray[0]['VISITOR_DETAILS_SIZE'] = document.getElementById('VISITOR_DETAILS_SIZE').value;
myArray[0]['VISITOR_DETAILS_INFO'] = document.getElementById('VISITOR_DETAILS_INFO').value;

私は次のような配列になります:

{
VISITOR_DETAILS_NAME : "Joe",
VISITOR_DETAILS_SIZE : "Large",
VISITOR_DETAILS_INFO : "User can enter anything here including double " and single ' quotes"
};

次に、 JSON.stringifyを使用してこの JavaScript 配列を非表示のフォーム フィールドに渡し、これを PHP に POST します。

document.getElementById('package').value = JSON.stringify(myArray[0]);
Theform.submit();

(今のところ、JSON が POST を介して JavaScript 配列を正しく渡していることをテストするために、iframe に投稿しているだけです)。

PHP側でそれを取得すると、うまくいくようです。JSON.stringifyが二重引用符(\" )にバックスラッシュを追加したように見えます- そして今、MySQL に値を保存したいと思います。配列 - だから私はこれを試します:

parent.myArray[0] = JSON.parse('<?php echo $_POST['package']; ?>');

エラーが発生します: SyntaxError: Expected token ')' OR SyntaxError: missing ) after argument list


これは私には奇妙です-投稿せずに試してみると、次のようにうまくいくようです:

document.getElementById('package').value = JSON.stringify(myArray[0]);

今、文字列化された値を配列に戻そうとすると

myArray[0] =  JSON.parse(document.getElementById('package').value);

- 正常に動作しているようです - エラーはありません


質問:

  • POSTED JSON.stringify()値から ARRAY を再構築しようとすると、このエラーが発生するのはなぜですか?
  • この JSON.stringify() 値をそのまま MySQL に保存しますか?
  • または、最初に PHP json_decode()を実行しますか?

フォーム データを取得し、適切に処理して、MySQL に保存し、必要なときにフォームに読み込みます。

皆さんありがとう :)

4

1 に答える 1

0
parent.myArray[0] = JSON.parse('<?php echo $_POST['package']; ?>');

ここでは、JSONテキストをJSONテキストのJavaScript文字列表現のHTML表現に変換しようとしていますが、それをエスケープするために何もしていません。

'JSONデータに文字が含まれている場合、それらはJavaScript文字列を終了します。

"JSONデータに文字が含まれている場合、それらはとして表されます\"\"、はのJavaScript文字列表現です"。JS文字列に入力したテキストをエスケープするために何もしないため、スラッシュ文字はJavaScriptパーサーによって消費され、JSONパーサーに到達する前に削除されます。

JavaScript文字列に配置するためにデータを変換する場合は、データをエスケープする必要があります。

ただし、JSONは(ほぼ)JavaScriptのサブセットです。そのため、JSONテキストをJavaScript文字列に変換して、JavaScriptオブジェクトに解析できるようにするプロセスは非常に複雑です。スキップして、次の場所に直接移動できます。

<script>
var foo = <?php echo $json; ?>
</script>

ただし、クライアントからJSONを取り込んでいるため、直接エコーアウトするとXSS攻撃にさらされます。これに対処するには、サーバー上のデータをフィルタリングする必要があります。

この意志:

  • 無効なJSONの解析に失敗するため、不正なJSONは出力されません(ただし、何も出力されず、JSON構文エラーが発生する可能性があります。テストを適用して、解析が成功したかどうかを確認し、失敗した場合は適切なデフォルトケースを出力する必要があります)。
  • </script>データ内の任意の<\/script>ものをスクリプト要素に安全に配置できるように変換します(これがPHPのjson_encode動作方法であるため)

そのような:

<!-- I don't do PHP, this is untested -->
<script>
var foo = <?php
    $unsafe_json = $_POST['package'];
    $data_structure = json_parse($unsafe_json);
    $safe_json = json_encode($data_structure);
    echo $safe_json;
?>;
</script>

このJSON.stringify()値をMySQLにそのまま保存しますか?または、最初にPHP json_decode()を実行しますか?

これは、データをどのように処理するかによって異なります。一般に、データベースにデータを入れるときは、データ形式からデータを追加して正規化することをお勧めします。そうすれば、クエリを実行できます。

データを保存してから取得するだけの場合は、それを行わずにJSONの文字列をデータベースに保存することで解決できる可能性があります。しかし、それはあなたに多くの柔軟性を失い、将来あなたを噛むかもしれません。

于 2013-01-30T09:41:11.277 に答える