ホーム > Flash | JSON | php | 文字コード > JSON + Flash + PHP での注意点

JSON + Flash + PHP での注意点

  • 2009/12/11 19:11
  • Flash | JSON | php | 文字コード

サーバーの設定によっては、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 より

ホーム > Flash | JSON | php | 文字コード > JSON + Flash + PHP での注意点

検索
フィード
メタ情報

ページの上部に戻る