AMFPHPを使ってMySQLデーターベースへ書き込みしてみました。

AMFPHPを使ってMySQLデーターベースへ書き込みしてみました。

こんな感じ。Flexからphpのクラスを呼び出してデーターの表示・追加が行えます。

AMFPHPを使うとphpで作成したクラスがそのままFlexから呼び出すことができます。

con.call("TestMySQLService.loadData", responder);

あとバイナリ通信となり、xml形式とは違い転送量が少なくとてもスマートです。
簡単な説明
AMFPHPをダウンロード
http://amfphp.org/
#今回はamfphp-1.9.beta.20080120.zipを使用してみました。
ダウンロードして解凍してできたファイルをwwwフォルダにコピーします。

日本語を扱う場合や文字コードSJISな場合は以下を書き換えます。
「/path/to/amfphp/gateway.php

//$gateway->setCharsetHandler("utf8_decode", "ISO-8859-1", "ISO-8859-1");
$gateway->setCharsetHandler("none", "ISO-8859-1", "ISO-8859-1");

簡易デバッグ方法として、
http://localhost/path/to/amfphp/browser/」がオススメです。
#AMFPHPを「/path/to/amfphp/」に置いた場合

クラスの一覧やメソッドの表示・実行がブラウザから行えます。
それでは、実際のMySQLのデーターを表示+追加するPHPプログラムです。
phpソースコード

<?php
class TestMySQLService{
    var $methodTable;
    function TestMySQLService(){
        //DBへコネクト
        $dbh  = mysql_connect("localhost", "root", "");
        $dbh_s = mysql_select_db( "iplflex" );
    }
    /* データ取得 */
    function loadData() {
        GLOBAL $dbh;
        $sql = " SELECT * FROM ipl_test WHERE print = 1 ";
        $result = mysql_query( $sql );
        while( $val = mysql_fetch_assoc( $result ) ){
            $res_list[] = array(
                                "name"    => mb_convert_encoding( $val['name']    , "UTF-8" , "SJIS" ),
                                "comment" => mb_convert_encoding( $val['comment'] , "UTF-8" , "SJIS" ),
                                "print"   => mb_convert_encoding( $val['print']   , "UTF-8" , "SJIS" ),
                            );
        }
        return $res_list;
    }
    /* データ挿入 */
    function writeData( $name = "" , $comment = "" , $print = "" ){
        GLOBAL $dbh;
        if ($name  != "" && $comment != "" && $print != "") {
            $name    = mysql_real_escape_string( $name );
            $comment = mysql_real_escape_string( $comment );
            $print   = mysql_real_escape_string( $print );
            $name    = mb_convert_encoding( $name    , "SJIS" , "UTF-8" );
            $comment = mb_convert_encoding( $comment , "SJIS" , "UTF-8" );
            $print   = mb_convert_encoding( $print   , "SJIS" , "UTF-8" );
            $sql = "INSERT INTO ipl_test ( name , comment , print )VALUES( '{$name}' , '{$comment}' ,'{$print}' ) ; ";
            $result = mysql_query( $sql );
        }
        return  $this->loadData();
    }
}
?>

mb_convert_encodingの部分はデータベースがsjisな場合。UTF-8な場合はいらないです。
Flexソースコード

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" verticalAlign="top" backgroundColor="white"
    creationComplete="init();">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import flash.net.NetConnection;
import flash.net.ObjectEncoding;
import flash.net.Responder;
[Bindable]
public var dataList:Array = [];//返り値受け取り用
private const GATEWAY_URL:String = "http://localhost/path/to/amfphp/gateway.php";
private function init():void {
    var responder:Responder = new Responder(onResult, onFault);
    var con:NetConnection = getCon();
    //データ受取
    con.call("TestMySQLService.loadData", responder);
}
//データ送信
private function sendMessage():void {
    var responder:Responder = new Responder(onResult, onFault);
    var con:NetConnection = getCon();
    con.call("TestMySQLService.writeData", responder, nameText.text , commentText.text , printText.text );
}
//コネクション初期化
private function getCon():NetConnection {
    var time:Number = (new Date()).getTime();
    var con:NetConnection = new NetConnection();
    con.connect(GATEWAY_URL + "?time=" + time);
    con.objectEncoding = ObjectEncoding.AMF3;
    return con;
}
//データ取得成功
private function onResult(etc:*):void {
    if (typeof etc == "object") {
        dataList = etc;
    } else {
        Alert.show("Error-2");
    }
}
//データ取得失敗
private function onFault(etc:*):void {
    Alert.show("Error-1");
}
]]>
</mx:Script>
<mx:ApplicationControlBar dock="true" width="521" height="68">
    <mx:Label data="名前:" />
    <mx:TextInput id="nameText" width="10%" />
    <mx:Label data="内容:" />
    <mx:TextInput id="commentText" width="335" />
    <mx:Label data="表示:" />
    <mx:TextInput id="printText" width="29" text="1"/>
    <mx:Button id="sendButton" label="送信" click="sendMessage();" />
</mx:ApplicationControlBar>
<mx:DataGrid id="dataGrid" dataProvider="{dataList}" width="100%" height="100%">
    <mx:columns>
        <mx:DataGridColumn dataField="name" headerText="名前" width="100" />
        <mx:DataGridColumn dataField="comment" headerText="内容" />
        <mx:DataGridColumn dataField="print" headerText="内容" />
    </mx:columns>
</mx:DataGrid>
</mx:Application>

参考にさせていただいたページはこちら
http://www.studio-hedgehog.com/blog/flash/2007/08/
http://blog.asial.co.jp/323