Sunday, September 13, 2009

Falsh access database

下面重点将三种flash请求和接收数据的方法

一、loadVariables

loadVariables(url:String, target:Object, [method:String]) : Void

url:服务端地址。

target:指向接收所加载变量的影片剪辑的目标路径。

method: [可选] - 指定用于发送变量的 HTTP 方法。该参数必须是字符串 GET或 POST。GET方法将变量附加到 URL 的末尾,它用于发送少量的变量。POST方法在单独的 HTTP 标头中发送变量,它用于发送长字符串的变量。

例:一个简单的flash与数据库交互的例子,当鼠标移动到按钮上时,在鼠标旁边以文本框的形式显示按钮的信息(按钮的信息在数据库中存储)。

Flash端请求数据代码:
function ShowInfo()
{
loadVariables("http://10.72.25.203/flashy/FlashService.aspx", _root, "POST");
hezuo_btn.label = "";
}

这样将根影片剪辑上的所有变量发送给了一个aspx服务,并指定用根影片剪辑_root,来接收服务端返回的数据,这样适合变量较少的情况,因为这中方法是将根影片剪辑上的所有变量都发送到了服务端,如果想有选择的对变量进行发送,可用http://10.72.25.203/flashy/FlashService.aspx?变量名1=变量1值&变量名2=变量2值 这种方式来发送。

Flash端接收服务端返回数据的代码:

_root.onData = function()
{
_root.createTextField("textV",3,this._xmouse-50,this._ymouse-50,100,35);
textV.border = true;
textV.borderColor = 0x33BDCC;
textV.background = true;
textV.backgroundColor = 0x33BDCC;
textV._alpha = 40;
textV.multiline = true;
textV.wordWrap = true;
textV.text = you;
};

用根影片剪辑的onData事件接收,并将接收到的数据(存储在变量you中)用文本域的形式显示。

Flash按钮事件和发送变量的定义代码:

var zhan_name:String;
play1_btn.onRollOver = function(){
zhan_name = "合作";
ShowInfo();
}
play2_btn.onRollOver = function(){
zhan_name = "百口泉";
ShowInfo();
}
play3_btn.onRollOver = function(){
zhan_name = "重油";
ShowInfo();
}

注意代码写完后在发布设置中将本地回放安全性设为:只访问网络(后面的例子全部做相同的设置)。


服务端接收代码:

Request.Form["zhan_name"];

注意如果用URL?Par1=Value1&Par2=Value2这种方式发送请求,接收代码应写为:
Request.QueryString["zhan_name "];

服务端返回给flash数据的代码:

Response.Write("you=返回的数据数据");

服务端完整代码:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OracleClient;

public partial class _Default : System.Web.UI.Page
{
OracleConnection OraCnn;
OracleCommand OC;
OracleDataAdapter OA;
protected void Page_Load(object sender, EventArgs e)
{
OraCnn = new OracleConnection(GetDataInfo());
}

private string GetDataInfo()
{
OracleConnectionStringBuilder OS = new OracleConnectionStringBuilder();
OS.UserID = "sdptest";
OS.Password = "sdptest";
OS.DataSource = "ORA116";
return OS.ConnectionString;
}

public void GetDataFromtoreProcedure()
{
Response.Write("you=");
OraCnn.Open();
OC = new OracleCommand("oilstore.oilstore", OraCnn);
OC.CommandType = CommandType.StoredProcedure;
OracleParameter OracleP1 = new OracleParameter("ZName", OracleType.VarChar, 10);
OracleP1.Direction = ParameterDirection.Input;
OracleP1.Value = Request.Form["zhan_name"];
OracleParameter OracleP2 = new OracleParameter("C", OracleType.Cursor);
OracleP2.Direction = ParameterDirection.Output;
OC.Parameters.Add(OracleP1);
OC.Parameters.Add(OracleP2);
OA = new OracleDataAdapter(OC);
DataTable DT = new DataTable();
OA.Fill(DT);
OraCnn.Close();
if (DT.Rows.Count > 0)
{
string curyou = string.Empty;
for (int i = 0; i < DT.Rows.Count; i++)
{
for (int j = 0; j < DT.Columns.Count; j++)
{
curyou += DT.Rows[i][j] + " ";
}
}
Response.Write(curyou);
}
else
{
Response.Write("无数据!");
}
}

}

服务端接收到变量zhan_name后,通过Oracle存储过程取数据,然后返回,注意返回形式:Response.Write("you="),将返回的结果集赋给了变量you,flash端可以接收到you的值,注意这种方式一次只能够返回一个变量,如果这样写:Response.Write("you=132,qi=234"),这样flash是读不出qi的,读出you的值是:132,qi=234。


Flash+PHP+mySQL

Flash的部分与ASP的部分一样, 只是把当中的后台文件名更改一下



function loadData() {
loader = new LoadVars();
loader.load("server.php?time="+new Date().getTime()); //向ASP取得资料的连接, 这里我不使用Math.random是因为这样有个缺点
loader.onLoad = function(success) {
if (success) {
display.htmlText = loader.Result; //loader.Result是ASP传递回来的资料
} };
} submit.onRelease = function() { //当按钮按下放开的时候
if (name.text.length == 0) { //这里是判断输入框是否为空
Selection.setFocus(name); //把光标设定在指定的输入框
} else if (msg.text.length == 0) { //同上
Selection.setFocus(msg);
} else {
status.text = ""; //这个动态文本你们可以自己设定
sender = new LoadVars();
sender.onLoad = function(success) {
if (success) {
if (sender.Result == "Success" ) { //传递回来的讯息为Success时
status.text = "记录成功...";
name.text = msg.text=""; //清空输入栏位
loadData(); //重新刷新资料
} else {
status.text = "记录失败, 请再次尝试...";
} delete sender; //养成习惯把LoadVars变量删除以释放内存空间
} };
sender.load("server.php?action=save&name="+name.text+"&msg="+msg.text, sender, "POST" );//和sendAndLoad的功用一样, 传送出变量并等待资料传回, 传回的资料会在onLoad中截取
} };
loadData(); //在一开始载入资料库中的资料

PHP部分 :



<?php
$DBhost = "localhost"; // 服务器的DNS名
$DBuser = "root"; // 用户名
$DBpass = ""; // 用户密码
$DBName = "super-tomato"; //资料库名字
$table = "guestbook"; // 资料库中资料表的名字

$DBConn = mysql_connect($DBhost,$DBuser,$DBpass) or die("無法連接資料庫 : " . mysql_error()); //开始连接mysql

mysql_select_db($DBName, $DBConn) or die("無法連接資料庫: " . mysql_error()); //选择mysql資料库并连接

if($action == "save" ) { //当Flash的action变量为save时
$sql = "INSERT INTO ".$table."(Name, Message) VALUES ('".$name."', '".$msg."')"; // 把资料写入资料表内
$insert = mysql_query($sql, $DBConn) or die("無法連接資料庫: " . mysql_error());
if($insert) { //资料写入成功
echo "&Result=Success";
} else {
echo "&Result=Fail";
} } else {
$sql = "SELECT * FROM ".$table; //取得资料表中所有的资料
$query = mysql_query($sql, $DBConn) or die("無法選取資料 : " . mysql_error());
while ($array = mysql_fetch_array($query)) { //循环取得每一笔资料
$strName = mysql_result($query, $i, "Name" );
$strMsg = mysql_result($query, $i, "Message" );
$record .= $strName." : ".$strMsg."<br>"; //把资料储存在变量当中
$i++;
} echo "&Result=".$record."<br><b>Finish</b>"; //传递变量中的资料到Flash
}

mysql_close(); //结束资料库连接
?>

******** PHP 连接 Microsoft Access 的方法 **********



<?
$db = "./Database.mdb";

$conn = new COM("ADODB.Connection" ); //在PHP使用COM来连接

// 两种方法都可以连接选一种即可
$conn->Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=$db" );
//$conn- > Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$db" );

$sql = "SELECT * FROM guestbook";
$rs = $conn- > Execute($sql);
?>

No comments: