2011年5月16日

[AS環境_下]Flash與AMFPHP的溝通_解決#2044: 未處理的 NetStatusEvent

首先,我們利用phpMyAdmin建立後端資料庫及資料表
create database testflash;
create table testing(
  number varchar(20)
);
再來,我們要建立可已用的服務(PHP Class) Counter
<?//Counter.phpclass Counter{
 var $dbhost = "localhost";   // 你host的位置(可以用IP)
 var $dbname = "testflash";      //你在資料庫表的名稱
 var $dbuser = "root";      //使用者帳號 
 var $dbpass = "******";    //使用者密碼(自己設)
 var $conn;
              
 function Counter(){                               //這個function主要是連接資料庫
  $this->conn = mysql_pconnect($this->dbhost, $this->dbuser, $this->dbpass);
  mysql_query("SET NAMES 'utf8'");
  mysql_select_db ($this->dbname);
 }
 function getData(){                              //這個是從資料庫拿取資料
  $rs=mysql_query("SELECT number FROM testing");        //number是目錄的名稱,若要取完全部資料可用*
  return $rs;  
 }
 function insert($number) {                //這是輸入資料進資料庫
  $sql="INSERT into testing (number) values";  
  $sql.="('$number')";  
  $result = mysql_query($sql)or die(mysql_error());      
  if($result)
   return mysql_insert_id($this->conn);
  }
}?>


以上三個黃字的部份:檔名、Class 名、建構子,一定要相同喔!
而在此Class下有兩個方法:getData,insert

接著,我們可以開發前端Client
AS是透過http://localhost/amfphp/gateway.php去指名服務(PHP Class)的位置
intext,btn_1如下

as:
stop();
import flash.net.URLRequest;
import flash.net.NetConnection;
import flash.net.Responder;
import flash.events.NetStatusEvent;
import flash.events.MouseEvent;
import flash.text.TextField;

var gateway:String = "http://localhost/amfphp/gateway.php";                //連接amfphp裡的gateway.phpvar connection:NetConnection;
var responder:Responder;           

btn_1.addEventListener(MouseEvent.CLICK,onBtnSendClick);
function onBtnSendClick(e:MouseEvent):void{
    responder = new Responder(onResult, onFault);      //資料傳送成功或失敗
    connection = new NetConnection;
    connection.connect(gateway);
    connection.call('Counter.insert', responder,intext.text.toString());  //call我們寫的PHP(檔案名稱.副程式名稱)
 
}
function onResult(onResult:Object):void {                                            //資料傳送成功時
    var saveData:Object=onResult;
    trace(saveData);
}
function onFault(fault:Object):void {                                                        //資料傳送失敗時
    trace("~failt~");
}


以上只要在input輸入任何值,按下btn_1後就會將值insert到我們的後端testflash資料庫裡
但阿斗遇到下面的問題:
##錯誤訊息
Error #2044: 未處理的 NetStatusEvent:。 level=error, code=NetConnection.Call.BadVersion
        at save_php1_fla::MainTimeline/frame1()


要把第amfphp/gateway.php的139行的程式碼註解
//$gateway->disableStandalonePlayer();
至於支援中文的問題,把127行的程式改為
$gateway->setCharsetHandler("utf8_decode", "UTF-8", "UTF-8");或$gateway->setCharsetHandler("iconv", "big5", "big5");
就看你要使用的編碼

2 則留言:

  1. 後來再次自己安裝amfphp
    遇到問題還真是一羅框
    問題一:
    touch(): Utime failed: Permission denied
    ......amfphp/core/shared/util/MethodTable.php on line 164
    解決:其實這是指你在amfphp/services/自製的class檔案權限不足~要開777(在自家電腦或它地無此問題,可能是虛擬機器給的帳號關係所以需要全開囉)

    回覆刪除
  2. 問題二:
    gateway.php出現Warning:Unknow:open_basedir restriction in effect. File() is now within the allowed Path(s):(....../tmp/xxx.com) in Unknown on lice 0
    解決:好吧!這問題我找非常非常久,幾乎所有blog都告訴你是版本php5.3以上不適用amfphp1.9
    但我php5.2也出現了~phpinfo()查看safe_mode~這應該也不影響~難不成是open_basedir裡參數表示不讓我有往上閱讀資料夾名稱的權限~經一再翻找後~虛擬機經濟商表示~是和我共用同台SERVER的某USER使用會影響php的設定語法........我相信和safe_mode有關~也就是說5.3版以後的對safe_mode整個大改變才會不能用!!!!!

    回覆刪除