1

さて、最近のプロジェクトで奇妙な要件がありました。CMSとキャッシュの制限を回避するために、いくつかのAJAX呼び出しを行った後、JSONオブジェクトをCookieに保存して更新する必要がありました。後でユーザーがプロセスを完了した場合、このCookieに保存されている情報は、以前に行われた選択を識別するために使用されます。完了には、数分から数週間かかる場合があります。実質的に時間制限のないページ変換。

$ _COOKIEグローバルからエンコードされたJSON文字列を抽出しようとすると、JSON構文エラーが発生し始めました(実際には、その時点より前にバグが発生しましたが、それが何が起こっているのかを理解し始めたときです)。Javascriptに組み込まれているJSON.stringifyを使用してCookie値を設定し、PHPではjson_decodeを使用していました。

どうやら、PHPは$ _COOKIEから出てくる文字列値の引用符をエスケープします。これにより、JSON構文エラーが発生し、その後にカスケード効果が発生しました。PHPJSON関数または$_COOKIEドキュメントに言及はありませんでした。'\'でpreg_replaceを実行してそれらを削除することになり、'動作します'。

それはハッキーな回避策のようです。足りないものはありましたか?将来これを行うためのより良い方法はありますか?

値とjson_last_error()をエコーする場合:

$ cookie = $ _COOKIE ['cookie_name']; => {\ "suffix \":\ "general \" ...}
$ cookie = json_decode($ cookie、true); =>構文エラー:NULL
$ cookie = preg_replace('/ \\ /'、 ""、$ cookie); => {"suffix": "general" ...}
$ cookie = json_decode($ cookie、true); =>エラーなし:ARRAY

4

2 に答える 2

4

json_encodeの2番目のパラメーターを次のように追加する必要があります(一部の定数にはPHP 5.3が必要です)

json_encode($data, JSON_HEX_QUOT | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);

また、オンにjson_decode(stripslashes($json))なっているようですので必要になりますmagic_quotes_gpc

于 2012-12-01T07:06:32.483 に答える
2

あなたはおそらく魔法の引用の犠牲者です。
それらがオフになっていることを確認してください。

于 2012-12-01T07:12:38.367 に答える