FLEX on PHP , ZendAMF 中文 UTF-8 測試報告
之前我們利用過 AMFPHP 來傳值,卻發現在中文有點問題,我們必須要更改幾支程式的編碼方式,才可以正確的得到中文的內容,有了這個前車之鑑,我們也來測試一下 ZendAMF 在中文傳值跟資料庫連接的測試吧。
值得慶幸的,ZENDAMF 在中文的傳值方面本身應該就支援 UTF-8 了,所以我們直接傳送中文資料到 GATEWAY ,並且我們自定義的 CLASS 也可以正確的把中文回傳給我們。
不過呢,事情也不是那麼美好,在資料庫的連線方面 AMFPHP 可以將 MYSQL QUERY 回來的資料直接丟給 FLEX ,在接收以後可以直接做顯示,不過 ZENDAMF 可沒這麼乖,取得的資料庫如果是用 MYSQL QUERY 丟回 FLEX 的話,接收到的會是一個空空如也的物件類型,你必須將每一列的資料都抓出來丟到陣列中才可以回傳到 FLEX 中,但是這樣一來應該會多浪費迴圈的處理時間,但是,在 ZENDAMF 的資料型態手冊中似乎也有提到其他的對應方式,尤其是 Zend_Amf_Value_ArrayCollection ,不過該怎麼用到這個類別,可能還得再摸一摸囉,可能 Zend_DB 這隻類別也可以摸摸看,也許有比較方便的寫法。
不過上次我上傳到 hostMonster 的網站空間的 AMFPHP 無法使用,但是 ZENDAMF 上傳之後卻可以正常使用呢,也是蠻值得開心的。
我在 ZENDAMF 的官方網站 找到了 ActionScript 與 ZEND PHP 之間的資料型態對應的說明,有空再來把文件翻清楚來。
| ActionScript –> PHP mapping | |
|---|---|
| ActionScript | PHP |
| undefined | null |
| null | null |
| int | integer |
| number | float |
| boolean | boolean |
| String | string |
| array | array |
| xml | DomDocument |
| flash.utils.ByteArray | string |
| uint | float |
| object | object |
| RemoteClass Object | class mapped object |
| date | DateTime |
| mx.collections.ArrayCollection | object |
| PHP –> ActionScript mapping | |
|---|---|
| PHP | ActionScript |
| null | null |
| boolean | boolean |
| string | string |
| DomDocument | xml |
| DateTime | date |
| float | number |
| integer | number |
| Associative Array w/ mix of keys | Object |
| Associative Array w/ Numeric index of keys | Array |
| object | object |
| RemoteClass Zend_Amf_Value_TypedObject | typed object |
| Zend_Amf_Value_ByteArray | flash.utils.ByteArray |
| Zend_Amf_Value_ArrayCollection | mx.collections.ArrayCollection |
我們來測試看看實作的效果吧 !
gateway.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php //Basic Config error_reporting(E_ALL | E_STRICT); //設定Error Report的等級 date_default_timezone_set('Asia/Taipei'); //設定時區為台北 //Include path //比較需要注意的是這邊新增了一個 library 的 PATH 路徑,用來供 ZFAMF 的資料互相存取 define ('P_S', PATH_SEPARATOR); set_include_path('.' .P_S .'library' .P_S .'../application/models/' .P_S .get_include_path()); //載入 ZFAMF 類別檔 require_once 'library/Zend/Amf/Server.php'; //載入我們的 HELLOW 類別檔 require_once 'hellow.php'; //建立 ZENDAMF SERVER $server = new Zend_Amf_Server(); //著名我們這裡面有一個 CLASS 叫做 HELLOW $server->setClass("hellow"); //執行結果 echo( $server -> handle() ); ?> |
hellow.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <?php define("dbserver","localhost"); define("dbusername","root"); define("dbpassword",""); define("dbname","db_test"); class hellow { public function sayHello($name){ //甚麼都不做,就回傳字串 return "中文測試 : ".$name; } public function getDbData(){ $db = new mysqli ( dbserver, dbusername, dbpassword, dbname ); $db->query ( "SET NAMES 'utf8'" ); $query = "select * from bloglink"; $result = $db->query ( $query ); $db->close(); //將讀取出的資料放入陣列中 for($i=0;$i<$result->num_rows;$i++){ $test[$i] = $result->fetch_assoc(); } //回傳陣列 return $test; } public function getDbDataResult(){ $db = new mysqli ( dbserver, dbusername, dbpassword, dbname ); $db->query ( "SET NAMES 'utf8'" ); $query = "select * from bloglink"; $result = $db->query ( $query ); $db->close(); //直接回傳 MYSQL 的 RESULT 物件 return $result; } } ?> |
ZendAMF.mxml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" fontSize="16">
<mx:Script>
<![CDATA[
import flash.net.navigateToURL;
import mx.collections.ArrayCollection;
import mx.rpc.events.ResultEvent;
private function getZendAMF():void{
this.ro.sayHello("中文傳值 許功蓋");
}
private function getZendAMFDB():void{
this.ro.getDbData();
this.ro.getDbDataResult();
}
private function resultHandler(event:ResultEvent):void{
this.ZendResult.dataProvider = event;
}
private function clickHandler():void{
var url:String = this.bloglink.selectedItem.m_url;
var req:URLRequest = new URLRequest(url);
navigateToURL(req,"_blank");
}
]]>
</mx:Script>
<mx:TextInput text="{this.ro.sayHello.lastResult}"/>
<mx:Button label="按下後使用 RemoteObject 取回 ZendAMF 後端資料" click="getZendAMF()"/>
<mx:DataGrid id="bloglink" dataProvider="{this.ro.getDbData.lastResult}" width="600" height="250" itemClick="clickHandler()">
<mx:columns>
<mx:DataGridColumn headerText="標題" dataField="m_title"/>
<mx:DataGridColumn headerText="日期" dataField="m_date" width="150"/>
</mx:columns>
</mx:DataGrid>
<mx:Button label="使用 ZENDAMF 取得資料庫的資料" click="getZendAMFDB()"/>
<mx:Label text="ZENDAMF 直接回傳 MySQL RESULT 卻只有拿到空的 OBJECT"/>
<mx:DataGrid id="ZendResult" width="600" height="250"/>
<mx:RemoteObject id="ro" destination="zend" source="hellow">
<mx:method name="getDbDataResult" result="resultHandler(event)"/>
</mx:RemoteObject>
</mx:Application> |
Random Posts
Loading…
相關文章 :












謝謝你的部落格。學到了好些東西
自己按照您的文章,測了一下,發現可以直接接 msql result回來
我想您的code
private function resultHandler(event:ResultEvent):void{
this.ZendResult.dataProvider = event;
}
改成 this.ZendResult.dataProvider = event.result; 應該就可以了
@爛芋頭
也可以那樣寫~
^_^ 其實寫法很多種~ 未來你還會遇到了
另外感謝你的支持喔~~
你的回覆讓我們感到很欣慰~~