1,目标
Flash第一帧读取MySQL的数据,逐条显示,数据从a.php中得到。在这一帧上添加一个“提交”按钮,加一个文本输入框。
Flash第二帧发送文本输入框中的数据到b.php,写入数据库,成功则回到第一帧显示最新结果。
2,实现过程及代码
(1)在MySQL中创建一个数据库flash,并创建一个表`user`,注意使用时user前后要有引号(!前面的键),该SQL语句在lib.php中
(2)a.php:从数据库中获取数据,b.php:向数据库中写入数据,代码如下:
a.php
<? require ("lib.php"); $rst = db_query("SELECT COUNT(*) AS total FROM user ORDER BY userID"); $arr = db_get_tuple($rst); echo "&total=".$arr["total"]."&"; $rst = db_query("SELECT * FROM user ORDER BY userId"); echo "&userName="; while ($arr=db_get_tuple($rst)) { echo $arr["userName"].","; } ?>
b.php
<? require ("lib.php"); $user = $_POST["userName"]; echo $user; if ($user != "") { $str = "INSERT INTO `user`(userName) VALUES('$user');"; db_query($str); } ?>
lib.php(a.php和b.php都加载了lib.php)
<? /* CREATE TABLE `user` ( `userId` INT NOT NULL AUTO_INCREMENT , `userName` VARCHAR( 32 ) NOT NULL , `userPwd` VARCHAR( 32 ) NOT NULL , PRIMARY KEY ( `userId` ) ); */ function db_connect() { $host = "localhost"; $user = "root"; $pwd = ""; $db = "flash"; $id = @mysql_connect($host, $user, $pwd); if(!$id) { echo "Connect Error."; exit(0); } mysql_select_db($db); return $id; } function db_close($conn) { if (!mysql_close($conn)) { echo "Connect Close Error"; exit(0); } } function db_query($str) { $conn = db_connect(); $rst = mysql_query($str, $conn); if ($rst == false) { echo "Error: ". $str; exit(0); } db_close($conn); return $rst; } function db_get_tuple($rst) { return @mysql_fetch_array($rst); } ?>
(3)建立一个flash文件,取名conn.fla,代码如下:
第一帧负责加载数据并显示,并添加一个按钮和一个输入框(变量:in_text),代码如下:
var myFormat = new TextFormat(); myFormat.color = 0xFF0000; // 文字颜色 myFormat.size = 25; // 文字大小 myFormat.font = "Arial"; // 文字字体 var lv:LoadVars = new LoadVars(); // 为了保证数据刷新,后面必须加一个时间变量,名字随便 lv.load("http://localhost/flash/a.php?idd="+new Date().getTime()); lv.onLoad = function(success:Boolean) { if(success) { var total = lv.total; // 将所有的用户名放到一个String里,然后按","分割到数组users var tmp:String = lv.userName; var users = new Array(); users = tmp.split(","); // 元组共有total条 var i; for (i=0; i<total; i++) { _root.createTextField("mytext"+i,1+i,80,(i+1)*40,200,100); obj = eval("mytext"+i); obj.text = users[i]; obj.setTextFormat(myFormat); } } else { trace("failed"); } } stop();
第二帧,负责发送数据
if (in_text != undefined) { var lv:LoadVars = new LoadVars(); lv.userName = in_text; lv.sendAndLoad("http://localhost/flash/b.php", lv, "post"); lv.onLoad = function(success:Boolean) { if(success) { gotoAndStop(1); // 不能用gotoAndPlay(1);,因为每按一下按钮,会写入多条重复数据,不知为何 } else { trace("failed"); } } }
按钮,发送数据需要按下按钮
on(release) { gotoAndPlay(2); }
3,注意点
(1)需要创建动态文本显示数据,有多少个元组就要创建多少个文本框,每个文本框的名字必须唯一。
创建动态文本框的函数为createTextField(),第一个参数为文本框的名字,第二个为深度depth,第三、四个参数为文本框的位置(x,y),第五、六个参数为文本框的长和宽。
(2)文本框的使用。首先不能枚举,如"mytext0","mytext1",...,因为记录数量不确定。使用时须
obj = eval("mytext"+i);
obj.text = "xxxx";
(3)文本框的样式。obj.setTextFormat(myFormat);该句设定了显示的样式,样式定义代码在最上面。其他样式可以去查类TextFormat()。
(4)文本框的内容。a.php的获取的所有数据拼在一个字符串里,按","分割。如果一个数据对应一个变量的话,那么for循环里的obj.text将没法赋值。
(5)输入框的“自动调整字距”前面的勾去掉,否则输入的则带有<html>标签。
(6)发送数据使用的函数是sendAndLoad,而不是send(),因为send不会更新最新的结果。
(7)关于刷新,一个很奇怪的问题。如果第一帧load代码是lv.load("http://localhost/flash/a.php");的话,Ctrl+Enter测试,一切正常。但放到网络上,就出问题了:提交后回到第一帧,获取的数据并不是最新的。所以a.php后面要加一个时间参数,参数名字随便。