プログラミング工房
TOP
Flex基本
開発環境 JavaScript連携 PHP連携1 PHP連携2(AMFPHP) ウィンドウ ボタンスキン 矩形スキン ローカルファイル(テキスト) F5等の対策 ローカルファイル(イメージ) ダウンロード、アップロード 1枚の画像のカラーを変更 時間のかかる計算処理 外部SWFの読込み
Flexで3D
Flexだけで3D Papervision3Dを使ってみる 3Dオブジェクト カメラ、前後判定の工夫しました 自由な形状を作成
Flexでクラス
Class1(白黒ゲームの盤) Class2(白黒ゲームのプレイヤー) Class3(プレイヤーを外部SWF)
PHP
共通関数1
Flexの作品
お問合せの説明 サンプルのソース表示の説明 分子構造の表示(PDBファイル) マンデルブロ集合の画像作成 swf参加型白黒ゲーム(Reversi) ストップウォッチ WEB素材
AIR
AIRを使ってみる ソースファイルのHTML変換を作る
etc.
マンデルブロ集合のギャラリー ジュリア集合のギャラリー wonderflを使ってみました お問合せ

Flex4基本-PHP連携1

■2011.02.17:作成
サンプル サンプルのソース

PHPのパスに関して

FlexからPHPプログラムを起動する時、PHPのパスを相対パス(例:./php/test.php)しておけば
  試験環境:http://localhost/・・・
  本番環境:http://programmingatelier.net/・・・
の両方で動くプログラムを作ることが出来る。

但しFlashDevelopから直接実行する時、PHPのパスを相対パスにしておくとPHPは起動しない。
絶対パス(http://localhost/・・・)ならばPHPは起動する。

全ての環境で変更なく実行できるようにするため以下のような方法を取ってみた
 *.swf自身のURLを取得するとFlashDevelopから直接実行の時は"file://・・・"となり
 WEB上で実行の時は"http://・・・"等になる。この値によりPHPのパスを変更すれば
 FlashDevelopから直接実行・WEB上の実行の両方に対応したプログラムを作れる。
private var strPhpUrl:String;   //PHPのあるパス

//初期処理
private function initDataSet():void {
    //*.swfのURLを取得->PHPのパスをセット
    var strUrl:String = mx.core.FlexGlobals.topLevelApplication.url;
    if (strUrl.indexOf("file") == 0) {  //FlashDevelopから実行
        strPhpUrl="http://localhost/flex4/FlexPHP1/bin/php/"
    } else {
        strPhpUrl="./php/"  //サーバで起動
    }
}

PHP連携

FlexでPHPにデータを渡すプログラムは以下のようになります。
 ・起動するPHPを指定する。(PHPのパスは上の設定方法で設定)
 ・PHPに渡すパラメータのセット
 ・PHPの戻り値の取得関数の定義とPHPの起動
//PHP連携1の開始
private function onFlexPHP1_1(event:MouseEvent):void {
    // URLRequestインスタンス
    var lcRequest : URLRequest = new URLRequest;
    lcRequest.url = strPhpUrl+"FlexPHP1_1.php";

    // URLVariablesインスタンス(送信データのセット)
    var lcVariables : URLVariables = new URLVariables;
    lcVariables.parm1 = taPaa1.text;
    lcVariables.parm2 = taPaa2.text;
    lcRequest.data = lcVariables;
    //POST送信
    lcRequest.method = URLRequestMethod.POST;

    // URLLoaderインスタンス生成
    var lcLoader : URLLoader = new URLLoader;

    // イベントリスナー登録(PHPから帰ってきた時呼ばれる関数)
    lcLoader.addEventListener(Event.COMPLETE, onPHPComp1);
    // PHPの呼び出し
    lcLoader.load(lcRequest);
}

PHPの戻り値の取得関数(onPHPComp1)
 ・lcLoader.dataでPHPからの受信データのオリジナルが取得出来ます。
   reParm1=aaaa&reParm2=bbbb
 ・URLVariables(lcLoader.data)でaaaaとbbbbに分解する事が出来ます。(注1)
//PHP連携1のPHPからの受信
private function onPHPComp1(event:Event):void { 
    taRePaa1.text= "";
    taRePaa2.text= "";
    taDataAll.text = "";

    try {
        var lcLoader : URLLoader = URLLoader(event.currentTarget);
        //PHPから受信した元データ
        taDataAll.text = lcLoader.data ;
        //PHPから受信したデータからParm1、Parm2取り出し
        var vars:URLVariables = new URLVariables(lcLoader.data);
        taRePaa1.text= vars.reParm1;
        taRePaa2.text= vars.reParm2;
    } catch (error:Error) {
        Alert.show(error.message,"FlexPHP1");  
    }  
}

PHPのプログラム(./php/FlexPHP1_1.php)
 ・$_POSTでFlexからのパラメータの取得します。
 ・echoでFlexに返すデータ(reParm1=aaaa&reParm2=bbbb)を出力します。(注1)
<?php
//Flexからの受信データ  
$parm1 = $_POST['parm1'];
$parm2 = $_POST['parm2'];

//データに"[]"を付ける
$parm1 = "[".$parm1."]";
$parm2 = "[".$parm2."]";

//データをファイルに保存
$pointer=fopen("debug.txt", "w");
fputs($pointer, "parm1=".$parm1."\n");
fputs($pointer, "parm1=".$parm2."\n");
fclose($pointer);

//返信データ
echo "reParm1=".$parm1;
echo "&reParm2=".$parm2;  //2個目以降は「&」を付ける 
?>
(注1)パラメータに「&」を含む時、PHPからFlexに返すデータが
  reParm1=aa&aa&reParm2=bbbb
 になりFlexのURLVariables関数でエラーになります。

PHP連携(XML版)

「PHP連携」でパラメータをXML形式で行ってみました。
  パラメータをXMLで作成して文字形式で送信しています。
//PHP連携2(XML)の開始
private function onFlexPHP1_2(event:MouseEvent):void {
    // URLRequestインスタンス生成...
    var lcRequest : URLRequest = new URLRequest;
    lcRequest.url = strPhpUrl+"FlexPHP1_2.php";

    // URLVariablesインスタンス(送信データのセット)
    var lcVariables : URLVariables = new URLVariables;
    var xml:XML = <root/>;  //XML形式でセット
    xml.parm1 = taPaa1.text;
    xml.parm2 = taPaa2.text;
    lcVariables.xml =  xml.toString();
    lcRequest.data = lcVariables;
    //POST送信
    lcRequest.method = URLRequestMethod.POST;

    // URLLoaderインスタンス生成
    var lcLoader : URLLoader = new URLLoader;
    // イベントリスナー登録(PHPから帰ってきた時呼ばれる関数)
    lcLoader.addEventListener(Event.COMPLETE, onPHPComp2);
    // PHPの呼び出し
    lcLoader.load(lcRequest);
}

PHPの戻り値の取得関数も戻り値をXMLにして、パラメータを取り出しています。
//PHP連携2(XML)のPHPからの受信
private function onPHPComp2(event:Event):void { 
    taRePaa1.text= "";
    taRePaa2.text= "";
    taDataAll.text = "";

    try {
        var lcLoader : URLLoader = URLLoader(event.currentTarget);
        //PHPから受信した元データ
        taDataAll.text = lcLoader.data ;
        //PHPから受信したデータからParm1、Parm2取り出し
        var xml:XML=XML(lcLoader.data);
        taRePaa1.text= xml.parm1;
        taRePaa2.text= xml.parm2;
    } catch (error:Error) {  
        Alert.show(error.message,"FlexPHP1");  
    }  
}

PHPのプログラム(./php/FlexPHP1_2.php)
 ・$_POSTで取得したデータでXMLを作成して、パラメータを取得
 ・Flexに返信するXMLを作成
   この時、パラメータに"&"が含まれるとエラーになるので"&"を"&amp;"に置換
   ("<"、">"等は問題なし、"&"は変換が必要、Flex側は不要)
 ・XMLを文字列にしてFlex側に返信
<?php
//Flexからの受信データ 
$doc = new DOMDocument();
$doc->loadXML($_POST['xml']);
$root = $doc->getElementsByTagName("root")->item(0);
$parm1 = $root->getElementsByTagName("parm1")->item(0)->firstChild->nodeValue;
$parm2 = $root->getElementsByTagName("parm2")->item(0)->firstChild->nodeValue;

//データに"[]"を付ける
$parm1 = "[".$parm1."]";
$parm2 = "[".$parm2."]";

//返信データのセット
$reDoc = new DOMDocument();
$eRoot = $reDoc->appendChild($reDoc->createElement('root'));
$ePar1 = $eRoot->appendChild($reDoc->createElement('parm1'));
$ePar1->nodeValue=str_replace("&","&amp;",$parm1);  //"&"を"&amp;"に置換
$ePar2 = $eRoot->appendChild($reDoc->createElement('parm2'));
$ePar2->nodeValue=str_replace("&","&amp;",$parm2);  //"&"を"&amp;"に置換

//データをファイルに保存
$reDoc->formatOutput = true;
$pointer=fopen("debug.txt", "w");
fputs($pointer, "doc=".$_POST['xml']."\n");
fputs($pointer, "parm1=".$parm1."\n");
fputs($pointer, "parm1=".$parm2."\n");
fputs($pointer, "reDoc=".$reDoc->saveXML()."\n");
fclose($pointer);

//返信データの送信
echo $reDoc->saveXML();
?>
XMLはFlex(as3)ではE4Xで、PHP側ではDOMを使用。
E4Xの方が簡単に記述できるが、XMLなのか他の形式のデータなのかわかり難い?
慣れるまで違和感がある。

プログラミング工房