首頁 > FLEX, PHP, 程式設計, 網頁設計 > FLEX on PHP , ZendAMF 中文 UTF-8 測試報告

FLEX on PHP , ZendAMF 中文 UTF-8 測試報告

2009年3月16日  瀏覽次數 : 5,013

之前我們利用過 AMFPHP 來傳值,卻發現在中文有點問題,我們必須要更改幾支程式的編碼方式,才可以正確的得到中文的內容,有了這個前車之鑑,我們也來測試一下 ZendAMF 在中文傳值跟資料庫連接的測試吧。

image 圖片 : 取得中文回傳資料,資料庫資料

值得慶幸的,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…

:: 把這篇好文推到書籤網站與更多人分享吧 ::
  • funp
  • Hemidemi
  • YahooKimo
  • Google
  • udn
  • Haohao
  • Live

相關文章 :

Ausir FLEX, PHP, 程式設計, 網頁設計 , , , , , ,

  1. 爛芋頭
    2010年1月7日18:01 | #1

    謝謝你的部落格。學到了好些東西

    自己按照您的文章,測了一下,發現可以直接接 msql result回來
    我想您的code
    private function resultHandler(event:ResultEvent):void{
    this.ZendResult.dataProvider = event;
    }

    改成 this.ZendResult.dataProvider = event.result; 應該就可以了

  2. 2010年1月7日18:03 | #2

    @爛芋頭

    也可以那樣寫~

    ^_^ 其實寫法很多種~ 未來你還會遇到了

    另外感謝你的支持喔~~
    你的回覆讓我們感到很欣慰~~

  1. 本篇文章目前尚無任何 trackbacks 和 pingbacks。