如果想问什么是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))。
//=========从FLASH读取变量,并写入数据库============
$name=$_POST['username'];
if($name!=""){
$contact=$_POST['usercontact'];
$message=$_POST['usermessage'];
$id=mysql_connect("localhost","root","123456");
mysql_select_db("totem",$id);
mysql_query("set character set gb2312");//防止读出数据出现乱码
$num=mysql_num_rows(mysql_query("select * from comments",$id))+1;//获取留言数量
//获取留言时间:
$cnunixtime=time()+8*60*60;
$gd=getdate($cnunixtime);
$cdt=$gd["year"]."-".$gd["mon"]."-".$gd["mday"]." ".$gd["hours"].":".$gd["minutes"].":".$gd["seconds"];
//获取留言者IP:
if($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"])
{
$ip=$HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
}
elseif($HTTP_SERVER_VARS["HTTP_CLIENT_IP"])
{
$ip=$HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
}
elseif($HTTP_SERVER_VARS["REMOTE_ADDR"])
{
$ip=$HTTP_SERVER_VARS["REMOTE_ADDR"];
}
elseif(getenv("HTTP_X_FORWARDED_FOR"))
{
$ip=getenv("HTTP_X_FORWARDED_FOR");
}
elseif(getenv("HTTP_CLIENT_IP"))
{
$ip=getenv("HTTP_CLIENT_IP");
}
elseif(getenv("REMOTE_ADDR"))
{
$ip=getenv("REMOTE_ADDR");
}
else
{
$ip="Unknown";
}
//向表info插入新数据:
$insert="insert into comments values($num,'$cdt','$ip','$name','$contact','$message','')";
mysql_query($insert,$id);
mysql_close($id);
}
//=========从数据库读取条目,并生成XML格式列表======
$id=mysql_connect("localhost","root","123456");
mysql_select_db("totem",$id);
mysql_query("set character set gb2312");
$readAll="select * from comments order by ID DESC";//DESC从大到小,ASC从小到大
$result=mysql_query($readAll,$id);
$totalnum=mysql_num_rows($result);//读取表comments总共数目
$pageIndexNum=3;//用于FLASH里加载用的每页显示数据条数
$pageTotalNum=(int)($totalnum/$pageIndexNum+1);
//----------------生成XML列表
echo"\n";
echo"".$totalnum."\n";
echo"".$pageIndexNum."\n";
echo"".$pageTotalNum."\n";
for($j=0;$j
echo"\n";
for($i=0;$i
$info=mysql_fetch_array($result,MYSQL_ASSOC);
echo"\n";
echo"".$info["ID"]."\n";
echo"".$info["SHIJIAN"]."\n";
echo"".$info["NAME"]."\n";
echo"".$info["CONTACT"]."\n";
echo"".$info["MESSAGE"]."\n";
echo"".$info["REPLY"]."\n";
echo"\n";
}
echo"\n";
}
echo"\n";
for($k=0;$k
$info=mysql_fetch_array($result,MYSQL_ASSOC);
echo"\n";
echo"".$info["ID"]."\n";
echo"".$info["SHIJIAN"]."\n";
echo"".$info["NAME"]."\n";
echo"".$info["CONTACT"]."\n";
echo"".$info["MESSAGE"]."\n";
echo"".$info["REPLY"]."\n";
echo"\n";
}
for($l=0;$l
echo"\n";
echo"\n";
echo"\n";
echo"\n";
echo"\n";
echo"\n";
echo"\n";
echo"\n";
}
echo"\n";
echo"\n";
//----------------------------
mysql_close($id);
?>
接下来是AS3的脚本,有附件,是FLASH CS5 的。没有写文档类,代码写在�上了
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.events.MouseEvent;
import flash.events.Event;
var url:URLRequest = new URLRequest("http://www.hyieq.com/phps/comments.php");
//上面的new URLRequest里就是要连接的php文件的位置,注意协议http,上面的只是示例位置。
var loader:URLLoader = new URLLoader ;
sendBtn.addEventListener(MouseEvent.CLICK,sendClick);
var forbidChar:RegExp = new RegExp("[#&<>|*]");
//这里用正则表达式来过滤一些不被允许的特殊字符
functionsendClick(e:MouseEvent)
{
//这个函数事先判断一下用户输入的是否含有非法字符
if (inputName.text.match(forbidChar))
{
warning.text ="称呼含有非法字符,请重输";
}
elseif (inputName.text=="")
{
warning.text ="称呼不能为空";
}
elseif (inputContact.text.match(forbidChar))
{
warning.text ="联系方式含有非法字符,请重输";
}
elseif (inputContact.text=="")
{
warning.text ="联系方式不能为空";
}
elseif (inputMessage.text.match(forbidChar))
{
warning.text ="留言含有非法字符,请重输";
}
elseif (inputMessage.text=="")
{
warning.text ="留言不能为空";
}
else
{
//如果都没问题了,则执行提交动作:
warning.text ="提交中......";
sendVars();
}
}
functionsendVars()
{
//这个函数就是执行发送任务了
System.useCodePage =true;
//关键句1:
var variables:URLVariables=new URLVariables();
variables.username = inputName.text;
variables.usercontact = inputContact.text;
variables.usermessage = inputMessage.text;
//关键句2:
url.method ="post";
url.data = variables;
//关键句3:
loader.load(url);
loader.addEventListener(Event.COMPLETE,loaded);
//上面这句其实是整个发送的配套动作,AS3里发送与读取是要一块执行的
pageNum = 1;
}
var myXML:XML;
var pageNum:int= 1,pageTotal:int,pagePerNum:int;
functionloaded(e:Event)
{
//等待完成加载动作后,其实就可以直接读取PHP里生成的XML格式文档了
showPage.text = pageNum +"/"+ pageTotal;
inputName.text ="";
inputContact.text ="";
inputMessage.text ="";
warning.text ="完成!";
myXML = new XML(e.currentTarget.data);
pageTotal =int(myXML.zongyeshu);
pagePerNum =int(myXML.yetiaoshu);
showPage.text = pageNum +"/"+ pageTotal;
loadList();
}
functionloadList()
{
//加载顺序留言列表
for(var i:int=0; i
{
//先清空一次
this["showID"+(i+1)].text="";
this["showName"+(i+1)].text="";
this["showMessage"+(i+1)].text="";
this["showTime"+(i+1)].text="";
this["showContact"+(i+1)].text="";
if (myXML.page[pageNum - 1].record[i].xuhao !="")
{
this["showID"+(i+1)].text=myXML.page[pageNum-1].record[i].xuhao;
this["showName"+(i+1)].text="来自: "+myXML.page[pageNum-1].record[i].xingming;
this["showContact"+(i+1)].text="联系方式: "+myXML.page[pageNum-1].record[i].lianxi;
this["showTime"+(i+1)].text=myXML.page[pageNum-1].record[i].shijian;
this["showMessage"+(i+1)].text=myXML.page[pageNum-1].record[i].liuyan;
}
}
}
pageUpBtn.addEventListener(MouseEvent.CLICK,upclick);
pageDownBtn.addEventListener(MouseEvent.CLICK,downclick);
functionupclick(e:MouseEvent)
{
pageNum > 1 ? pageNum--:0;
showPage.text = pageNum +"/"+ pageTotal;
loadList();
}
functiondownclick(e:MouseEvent)
{
pageNum
showPage.text = pageNum +"/"+ pageTotal;
loadList();
}
functiondefaultLoad()
{
//默认没发送数据的情况加载一次留言列表
System.useCodePage =true;
warning.text ="加载中...";
loader.load(url);
loader.addEventListener(Event.COMPLETE,loaded);
}
defaultLoad();
然后上传到自己的本地服务器测试一下吧,祝读者成功!
下面是附件(这个附件是不能直接运行的,里面是写好的代码而已,还需要自己配置好环境和MySQL,按上例做的话才可测试):