サーバーの設定によっては、POST送信したデータの中に、意図しない「\」(バックスラッシュ)が混入するケースがある。
要因は、php.ini での設定項目、magic_quotes_gpc パラメーター。
http://jp.php.net/manual/ja/info.configuration.php#ini.magic-quotes-gpc
サーバーの処理では、「GPC処理」というものがあるらしい。
端的に言えば、GET,POST,COOKIEのデータが受渡される際に、なんやかんやとデータに対する処理が行われる、と。
その時に、シングルクオート(‘)、ダブルクオート(“)、バックスラッシュ(\)、NULL(という文字?未確認)には、
すべて自動でバックスラッシュ・エスケープ処理が行われる。 そんな設定がある、と。
いろいろと問題が起こったスクリプトの概要はこんな感じ。
recieveJSON.php
<?php $obj=$_POST["com"]; echo "comp=" . $obj; ?>
ActionScript3
//URL変数を用意
var myURLVar = new URLVariables();
var testSTR:String = '{"name":"富士山", "altitude":3776}';
myURLVar.com = testSTR; //この時点で、勝手にescape処理が行われるので、自前で記述する必要なし
//URLRequestのdataプロパティに突っ込む。
var req:URLRequest = new URLRequest("php/recieveJSON.php");
req.data = myURLVar;
//Loader 設定、そしてロード。
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onComplete);
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.load(req);
function onComplete(e:Event):void{
trace(e.target.data.comp)
}
出力は以下。
{\"name\":\"富士山\", \"altitude\":3776}
サーバー側の設定で、GPC処理がOnになっていると、ダブルクオートの直前にバックスラッシュエスケープが
挿入される。それをそのまま echo で出力すると、上記のようになる、と。
なんでわざわざ、バックスラッシュ・エスケープする必要があるのかよく分からないんですが。
解決方法
1. php.iniの書き換え
magic_quotes_gpc = On と書いてある所があるので、それを
magic_quotes_gpc = Offにする。
2. php内で頑張る
stripcslashesすると、クォートされた文字列を、クォートされてない状態に戻してくれる。
<?php $obj=$_POST["com"]; echo "comp=" . stripcslashes($obj); ?>
3. swf内で頑張る
ダブりを承知で、encodeURIをする。
ダブりというのは、URLVariablesの動的プロパティに値を突っ込んだ段階で、本来はescapeされているのだけど、
そこにさらに、encodeURIをかぶせる、という事。
//URL変数を用意
var myURLVar= new URLVariables();
var testSTR:String = '{"name":"富士山", "altitude":3776}';
myURLVar.com = encodeURI(testSTR); // ダブり箇所
trace("myURLVar= "+ myURLVar)
//以下は一緒
上記コードのトレース出力は、以下の通り。
myURLVar= com=%257B%2522name%2522%3A%2522%25E5%25AF%258C%25E5%25A3%25AB%25E5%25B1%25B1%2522%2C%2520%2522altitude%2522%3A3776%257D
上記の値をほうを、http://urlencode.net/でデコードしてみると、
%7B%22name%22:%22%E5%AF%8C%E5%A3%AB%E5%B1%B1%22,%20%22altitude%22:3776%7D
となる。
ようは、「%」をさらにエンコードして、「%25」にしてあるだけです。
これでなぜ、php再度のGPC処理のダブルクオートがエスケープされる処理がなかった事になるのか、
詳細は理解出来てません(汗。
091214 追記
phpから単純に echo すると成功してる風なんですが、実際、php内でjson_decodeが出来ない
状態に陥ってしまうようです。
なので、実質、swf内では何も出来ないって事ですかね・・・。
どの方法でJSONを利用するか
magic_quotes_gpc設定をOffると何か他の処理で影響があったりするのでしょうか。
僕にはその知識がないので、なんとも言えませんが、もし問題なければ、この方法が最もいいんじゃないでしょうか。
PHPer, AS3er, ともに、余計な処理なしにイケます。
サーバー設定を変えられない場合、できればPHPer に頑張ってもらうほうが、ベターだと思います。
1文字ごとに、「%」が「%25」に変わると、単純に3倍のデータ転送量になりますし。(計算あってます?)
ダメ、PHPer がやってくれない、みたいな状況なら、しゃーないですね、データ量3倍だけど、
AS3erがescape * encodeURI で処理しましょう、って流れですかね。
いやー、PHP と サーバーの事は、よーわからん。
コメント:0
トラックバック:0
- この記事のトラックバック URL
- http://djakarta-trap.net/blog/2009/12/json-flash-php_1/trackback/
- トラックバックの送信元リスト
- JSON + Flash + PHP での注意点 - djakarta-trap より