实例演示地址:http://www.52totem.com/test/liuyan.html  (下面有附件下载)

如果想问什么是PHP的话,百度一下吧,再百度一下“如何配置PHP环境”,满地都是教程。

FLASH不能直接操作文件与数据库,于是就得通过PHP的行为来间接操作。留言板实现原理很表现了Flash做web开发的基本方式。动态脚本用JSP,ASP也都可以的,它们的功能就是从FLASH接收数据,然后写入文件或数据库,再将数据库给读取出来。这里以PHP为例。

这个留言板的基本原理:FLASH里填入数据,然后执行对外发送脚本;PHP即接收FLASH发送来的数据,经过整理加工,写入数据库,然后将数据库里的数据读取出来,输出成XML格式文档;FLASH再动态加载这个XML格式的PHP。

那么开始吧→_→【ps:下面的代码是基于对AS3有相对扎实了解的,可能还需要读者认真阅读,我已经尽量写了注释了】

首先是PHP,PHP从FLASH里一次接收这三个变量:inputName,inputContact,inputMessage。

 这个是PHP文档,文件名是comments.php。需要确定已经建立好数据库,这里示例数据库是totem,表是comments,表规格是这样:(ID SMALLINT, SHIJIAN DATETIME, IP CHAR(15), NAME CHAR(20), CONTACT CHAR(20), MESSAGE CHAR(100), REPLY CHAR(100))。

  1. <?php  
  2.  //=========从FLASH读取变量,并写入数据库============  
  3.  $name = $_POST['username'];  
  4.  if ($name!=""){  
  5.         $contact = $_POST['usercontact'];  
  6.         $message = $_POST['usermessage'];  
  7.         $id=mysql_connect("localhost","root","123456");  
  8.         mysql_select_db("totem",$id);  
  9.         mysql_query("set character set gb2312");//防止读出数据出现乱码  
  10.         $num=mysql_num_rows(mysql_query("select * from comments",$id))+1;//获取留言数量  
  11.         //获取留言时间:  
  12.         $cnunixtime=time()+8*60*60;  
  13.         $gd=getdate($cnunixtime);  
  14.         $cdt=$gd["year"]."-".$gd["mon"]."-".$gd["mday"]." ".$gd["hours"].":".$gd["minutes"].":".$gd["seconds"];  
  15.         //获取留言者IP:  
  16.         if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"])   
  17.         {   
  18.         $ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];   
  19.         }   
  20.         elseif ($HTTP_SERVER_VARS["HTTP_CLIENT_IP"])   
  21.         {   
  22.         $ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];   
  23.         }  
  24.         elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"])   
  25.         {   
  26.         $ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];   
  27.         }   
  28.         elseif (getenv("HTTP_X_FORWARDED_FOR"))   
  29.         {   
  30.         $ip = getenv("HTTP_X_FORWARDED_FOR");   
  31.         }   
  32.         elseif (getenv("HTTP_CLIENT_IP"))   
  33.         {   
  34.         $ip = getenv("HTTP_CLIENT_IP");   
  35.         }   
  36.         elseif (getenv("REMOTE_ADDR"))  
  37.         {   
  38.         $ip = getenv("REMOTE_ADDR");   
  39.         }   
  40.         else   
  41.         {   
  42.         $ip = "Unknown";   
  43.         }   
  44.         //向表info插入新数据:  
  45.         $insert="insert into comments values($num,'$cdt','$ip','$name','$contact','$message','')";  
  46.         mysql_query($insert,$id);  
  47.         mysql_close($id);  
  48.  }   
  49.  
  50.  //=========从数据库读取条目,并生成XML格式列表======  
  51.  $id=mysql_connect("localhost","root","123456");  
  52.  mysql_select_db("totem",$id);  
  53.  mysql_query("set character set gb2312");  
  54.  $readAll="select * from comments order by ID DESC";     //DESC从大到小,ASC从小到大  
  55.  $result=mysql_query($readAll,$id);  
  56.  $totalnum=mysql_num_rows($result);                        //读取表comments总共数目  
  57.  $pageIndexNum=3;//用于FLASH里加载用的每页显示数据条数  
  58.  $pageTotalNum=(int)($totalnum/$pageIndexNum+1);  
  59.  //----------------生成XML列表  
  60.  echo "<main>\n";  
  61.  echo "<zongtiaoshu>".$totalnum."</zongtiaoshu>\n";  
  62.  echo "<yetiaoshu>".$pageIndexNum."</yetiaoshu>\n";  
  63.  echo "<zongyeshu>".$pageTotalNum."</zongyeshu>\n";  
  64.          for($j=0;$j<(int)($totalnum/$pageIndexNum);$j++){  
  65.             echo "<page>\n";  
  66.             for($i=0;$i<$pageIndexNum;$i++){  
  67.                 $info=mysql_fetch_array($result,MYSQL_ASSOC);  
  68.                 echo "<record>\n";  
  69.                 echo "<xuhao>".$info["ID"]."</xuhao>\n";  
  70.                 echo "<shijian>".$info["SHIJIAN"]."</shijian>\n";  
  71.                 echo "<xingming>".$info["NAME"]."</xingming>\n";  
  72.                 echo "<lianxi>".$info["CONTACT"]."</lianxi>\n";  
  73.                 echo "<liuyan>".$info["MESSAGE"]."</liuyan>\n";  
  74.                 echo "<huifu>".$info["REPLY"]."</huifu>\n";  
  75.                 echo "</record>\n";  
  76.             }  
  77.             echo "</page>\n";  
  78.         }  
  79.         echo "<page>\n";  
  80.         for($k=0;$k<$totalnum%$pageIndexNum;$k++){  
  81.                 $info=mysql_fetch_array($result,MYSQL_ASSOC);  
  82.                 echo "<record>\n";  
  83.                 echo "<xuhao>".$info["ID"]."</xuhao>\n";  
  84.                 echo "<shijian>".$info["SHIJIAN"]."</shijian>\n";  
  85.                 echo "<xingming>".$info["NAME"]."</xingming>\n";  
  86.                 echo "<lianxi>".$info["CONTACT"]."</lianxi>\n";  
  87.                 echo "<liuyan>".$info["MESSAGE"]."</liuyan>\n";  
  88.                 echo "<huifu>".$info["REPLY"]."</huifu>\n";  
  89.                 echo "</record>\n";  
  90.         }  
  91.         for($l=0;$l<$pageIndexNum-$totalnum%$pageIndexNum;$l++){  
  92.                 echo "<record>\n";  
  93.                 echo "<xuhao></xuhao>\n";  
  94.                 echo "<shijian></shijian>\n";  
  95.                 echo "<xingming></xingming>\n";  
  96.                 echo "<lianxi></lianxi>\n";  
  97.                 echo "<liuyan></liuyan>\n";  
  98.                 echo "<huifu></huifu>\n";  
  99.                 echo "</record>\n";  
  100.         }  
  101.         echo "</page>\n";  
  102.  echo "</main>\n";  
  103.  //----------------------------  
  104.  mysql_close($id);  
  105. ?> 

接下来是AS3的脚本,有附件,是FLASH CS5 的。没有写文档类,代码写在幁上了

 

  1. import flash.net.URLRequest;  
  2. import flash.net.URLLoader;  
  3. import flash.events.MouseEvent;  
  4. import flash.events.Event;  
  5.  
  6. var url:URLRequest = new URLRequest("http://www.hyieq.com/phps/comments.php");  
  7. //上面的new URLRequest里就是要连接的php文件的位置,注意协议http,上面的只是示例位置。  
  8. var loader:URLLoader = new URLLoader  ;  
  9. sendBtn.addEventListener(MouseEvent.CLICK,sendClick);  
  10. var forbidChar:RegExp = new RegExp("[#&<>|*]");  
  11. //这里用正则表达式来过滤一些不被允许的特殊字符  
  12. function sendClick(e:MouseEvent)  
  13. {  
  14.     //这个函数事先判断一下用户输入的是否含有非法字符  
  15.     if (inputName.text.match(forbidChar))  
  16.     {  
  17.         warning.text = "称呼含有非法字符,请重输";  
  18.     }  
  19.     else if (inputName.text=="")  
  20.     {  
  21.         warning.text = "称呼不能为空";  
  22.     }  
  23.     else if (inputContact.text.match(forbidChar))  
  24.     {  
  25.         warning.text = "联系方式含有非法字符,请重输";  
  26.     }  
  27.     else if (inputContact.text=="")  
  28.     {  
  29.         warning.text = "联系方式不能为空";  
  30.     }  
  31.     else if (inputMessage.text.match(forbidChar))  
  32.     {  
  33.         warning.text = "留言含有非法字符,请重输";  
  34.     }  
  35.     else if (inputMessage.text=="")  
  36.     {  
  37.         warning.text = "留言不能为空";  
  38.     }  
  39.     else 
  40.     {  
  41.         //如果都没问题了,则执行提交动作:  
  42.         warning.text = "提交中......";  
  43.         sendVars();  
  44.     }  
  45. }  
  46. function sendVars()  
  47. {  
  48.     //这个函数就是执行发送任务了  
  49.     System.useCodePage = true;  
  50.     //关键句1:  
  51.     var variables:URLVariables=new URLVariables();  
  52.     variables.username = inputName.text;  
  53.     variables.usercontact = inputContact.text;  
  54.     variables.usermessage = inputMessage.text;  
  55.     //关键句2:  
  56.     url.method = "post";  
  57.     url.data = variables;  
  58.     //关键句3:  
  59.     loader.load(url);  
  60.     loader.addEventListener(Event.COMPLETE,loaded);  
  61.     //上面这句其实是整个发送的配套动作,AS3里发送与读取是要一块执行的  
  62.     pageNum = 1;  
  63. }  
  64. var myXML:XML;  
  65. var pageNum:int = 1,pageTotal:int,pagePerNum:int;  
  66.  
  67. function loaded(e:Event)  
  68. {  
  69.     //等待完成加载动作后,其实就可以直接读取PHP里生成的XML格式文档了  
  70.     showPage.text = pageNum + "/" + pageTotal;  
  71.     inputName.text = "";  
  72.     inputContact.text = "";  
  73.     inputMessage.text = "";  
  74.     warning.text = "完成!";  
  75.     myXML = new XML(e.currentTarget.data);  
  76.     pageTotal = int(myXML.zongyeshu);  
  77.     pagePerNum = int(myXML.yetiaoshu);  
  78.     showPage.text = pageNum + "/" + pageTotal;  
  79.     loadList();  
  80. }  
  81. function loadList()  
  82. {  
  83.     //加载顺序留言列表  
  84.     for (var i:int=0; i<pagePerNum; i++)  
  85.     {  
  86.         //先清空一次  
  87.         this["showID"+(i+1)].text="";  
  88.         this["showName"+(i+1)].text="";  
  89.         this["showMessage"+(i+1)].text="";  
  90.         this["showTime"+(i+1)].text="";  
  91.         this["showContact"+(i+1)].text="";  
  92.         if (myXML.page[pageNum - 1].record[i].xuhao != "")  
  93.         {  
  94.             this["showID"+(i+1)].text=myXML.page[pageNum-1].record[i].xuhao;  
  95.             this["showName"+(i+1)].text="来自:  "+myXML.page[pageNum-1].record[i].xingming;  
  96.             this["showContact"+(i+1)].text="联系方式:  "+myXML.page[pageNum-1].record[i].lianxi;  
  97.             this["showTime"+(i+1)].text=myXML.page[pageNum-1].record[i].shijian;  
  98.             this["showMessage"+(i+1)].text=myXML.page[pageNum-1].record[i].liuyan;  
  99.         }  
  100.     }  
  101. }  
  102. pageUpBtn.addEventListener(MouseEvent.CLICK,upclick);  
  103. pageDownBtn.addEventListener(MouseEvent.CLICK,downclick);  
  104. function upclick(e:MouseEvent)  
  105. {  
  106.     pageNum > 1 ? pageNum--:0;  
  107.     showPage.text = pageNum + "/" + pageTotal;  
  108.     loadList();  
  109. }  
  110. function downclick(e:MouseEvent)  
  111. {  
  112.     pageNum < pageTotal ? pageNum++:0;  
  113.     showPage.text = pageNum + "/" + pageTotal;  
  114.     loadList();  
  115. }  
  116. function defaultLoad()  
  117. {  
  118.     //默认没发送数据的情况加载一次留言列表  
  119.     System.useCodePage = true;  
  120.     warning.text = "加载中...";  
  121.     loader.load(url);  
  122.     loader.addEventListener(Event.COMPLETE,loaded);  
  123. }  
  124. defaultLoad(); 

然后上传到自己的本地服务器测试一下吧,祝读者成功!

下面是附件(这个附件是不能直接运行的,里面是写好的代码而已,还需要自己配置好环境和MySQL,按上例做的话才可测试):