我目前正在做一个在TutsPlus上找到的教程。 本教程是通过PHP将信息从AS3保存到MySQL,然后检索此信息。
到目前为止,它有效。我可以输入用户名和分数,保存到数据库。但是有一个问题,我希望能够在表格中显示所有名称和分数,而不必搜索名称,然后找到该特定用户的分数。
保存信息的代码(可以使用),如下所示。
package {
import flash.display.*;
import flash.events.*;
import flash.net.*;
public class register extends MovieClip {
public function register ():void {
register_button.buttonMode = true;
register_button.addEventListener(MouseEvent.MOUSE_DOWN, checkForm);
username_text.text = "";
userbio_text.text = "";
}
public function checkForm (e:MouseEvent):void {
if (username_text.text != "" && userbio_text.text != "") {
sendForm();
} else {
result_text.text = "PLEASE ENTER A NAME";
}
}
public function sendForm ():void {
/*
we use the URLVariables class to store our php variables
*/
var phpVars:URLVariables = new URLVariables();
phpVars.username = username_text.text;
phpVars.userbio = userbio_text.text;
/*
we use the URLRequest method to get the address of our php file and attach the php vars.
*/
var urlRequest:URLRequest = new URLRequest("localhost/php/register.php");
/*
the POST method is used here so we can use php's $_POST function in order to recieve our php variables.
*/
urlRequest.method = URLRequestMethod.POST;
/*
this attaches our php variables to the url request
*/
urlRequest.data = phpVars;
/*
we use the URLLoader class to send the request URLVariables to the php file
*/
var urlLoader:URLLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
/*
runs the function once the php file has spoken to flash
*/
urlLoader.addEventListener(Event.COMPLETE, showResult);
/*
we send the request to the php file
*/
urlLoader.load(urlRequest);
}
/*
function to show result
*/
public function showResult (e:Event):void {
result_text.text = "" + e.target.data.result_message;
}
}
}
从这里,我可以转到另一个应用程序并搜索用户名,然后显示该用户得分。代码如下:
package actions {
import flash.display.MovieClip;
import flash.events.*;
import flash.net.*;
import flash.text.*;
public class main extends MovieClip {
public function main ():void {
submit_button.buttonMode = true;
submit_button.addEventListener(MouseEvent.MOUSE_DOWN, checkLogin);
username.text = "";
}
public function checkLogin (e:MouseEvent):void {
if (username.text == "") {
username.text = "Enter your username";
}
else {
processLogin();
}
}
public function processLogin ():void {
var phpVars:URLVariables = new URLVariables();
var phpFileRequest:URLRequest = new URLRequest("http://xx.xx.xx.uk/~bf93fv/Source%202/php/controlpanel.php");
phpFileRequest.method = URLRequestMethod.POST;
phpFileRequest.data = phpVars;
var phpLoader:URLLoader = new URLLoader();
phpLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
phpLoader.addEventListener(Event.COMPLETE, showResult);
phpVars.systemCall = "checkLogin";
phpVars.username = username.text;
phpLoader.load(phpFileRequest);
}
public function showResult (event:Event):void {
result_text.autoSize = TextFieldAutoSize.LEFT;
result_text.text = "" + event.target.data.systemResult;
}
}
}
controlpanel.php文件分别显示用户名和分数:
<?php
include_once "connect.php";
$username = $_POST['username'];
if ($_POST['systemCall'] == "checkLogin") {
$sql = "SELECT * FROM users WHERE username='$username'";
$query = mysql_query($sql);
$login_counter = mysql_num_rows($query);
if ($login_counter > 0) {
while ($data = mysql_fetch_array($query)) {
$userbio = $data["user_bio"];
print "systemResult=$username Scored $userbio";
}
}
else {
print "systemResult=The login details dont match our records.";
}
}
?>
为了将数据库中的所有信息都查看到表中,有没有人知道任何简单的方法?
答案 0 :(得分:2)
您可能希望在PHP代码中改进一些东西(AS3更好)。
使用PDO
代替适用于特定DBMS的函数。这样做的原因是它是便携式的(在某种程度上)。比方说,如果你想将数据库从MySQL移动到Postgres,你必须重写更少的代码,否则你将不得不重写。 PDO还提供了一些消毒输入的方法。它不是防弹 - 仍然没有更好。 PDO被认为是良好的实践&#34;,因此您将学会立即编写好的代码,而不是首先编写新的代码,然后发现如何正确地执行它。如果您正在考虑一个非常原始的任务(例如单个选择),那可能会稍微冗长一些,但只要您的任务变得稍微复杂一点,它就变得非常值得花时间。
在SQL查询中,除非进行测试/调试,否则永远不要使用select *
。这种懒惰最终会让你失去很多问题。通过这样做,您将很难在以后维护您的代码,有效地将其转换为&#34;编写一次 - 逃避&#34;之类的事情。再次,作为一个简单的概念证明,没关系, - 长期解决方案 - 不好。如果您仍然模糊我想说的话:明确列出所有列名称。
使用include
/ require
及其_once
系列作为长期解决方案是一个坏主意。再次,可以进行简单的测试 - 从长远来看不好。好的程序是用函数/类编写的,并使用__autoload()
或使用自动加载类的能力的框架。这使得更大的应用程序更易于管理,更易于导航和理解,包括web。
您必须清理来自您的网络应用程序用户的输入,即{not} $_POST['key']
。至少编写一个函数来检查密钥是否存在以及它是否具有预期的格式。
现在,您的实际问题是,发送数据。
您只需发送您在PHP中获得的原始SQL输出 - 将为您的服务器提供重新编码所有内容的问题。适用于非常简单的情况,但随着更复杂的任务变得更加复杂。这也是不常见的,所以你会发现人们不知道如何处理它。 (没有技术限制,它只是一个真正的历史文物)。
有许多流行的格式可以被各种应用程序消化,而不是必需的Flash。那些包括XML,JSON,Protobuf。还有一些更特别的PHP,如serialize()
生成的PHP。如果沿着这条路走下去,我强烈建议你坚持使用JSON。 XML可能是一种更为成熟的技术,但JSON具有内置的基本类型系统的优势(而在XML中它是另一层,除了其他东西没有在Flash中实现 - 我&#39;我在谈论XSL)。
有AMF(ActionScript消息格式) - 它是Flash的理想选择。 PHP也非常清楚如何生成它(有几个流行的实现)。与JSON或XML相比,此格式更紧凑。它具有更强的表达能力(可以描述循环依赖关系,多对多关系,具有引入自定义类型的过程,自定义[de]序列化例程)。除非您使用自定义序列化例程,否则它也是自描述的。如果您不打算稍后将应用程序迁移到JavaScript,这是最佳选择,因为JavaScript在使用二进制数据时遇到问题。在那里解析这种格式是不可能的。
Protobuf也是一个可行的选择。这是Google设计的数据交换格式。它在精神上与AMF类似,但它可能不是自我描述的。它依赖于应用程序来了解如何从中生成自定义对象。但是,它有一个表单,可以用JavaScript解析(虽然你失去了紧凑性的好处)。
您的ActionScript代码:如果您选择AMF,则需要查看NetConnection
课程。我建议你看看AMFPHP项目 - 它也有例子。或者,Zend Framework具有Zend_Amf
库用于此目的。但是在开始时使用整个框架可能会让人势不可挡。
如果你使用XML - 那么它就是一个内置的XML类,网上有数百万个关于如何使用它的例子。
如果你使用JSON,那么不久之前还有一个内置的类。但在有一个之前,有几个库可以解析它。
在GoogleCode上曾经有一个项目用于Flash中的Protobuf支持,但它需要相当多的无罪释放和手工劳动才能开始。
最后,这里提到的事情索引:
http://php.net/manual/en/book.pdo.php - PDO
http://php.net/manual/en/function.json-encode.php - PHP中的JSON
http://php.net/manual/en/book.dom.php - PHP中的XML (如果考虑PHP,则没有就哪个XML库更好达成一致意见。我可能会坚持这个,但是ymmv)。 < / p>
http://www.silexlabs.org/amfphp/ - PHP中的AMF
http://framework.zend.com/manual/1.12/en/zend.amf.html Zend_Amf库
http://code.google.com/p/protobuf-actionscript3/ ActionScript中的Protobuf
https://github.com/drslump/Protobuf-PHP PHP Protobuf (对不起,从来没用过这个,但看起来不错)
http://www.blooddy.by/en/crypto/适用于旧版Flash播放器 - 此库拥有我所知的最佳JSON解码器。
答案 1 :(得分:0)
最好的方法是(我认为)使用XML。
在PHP端,脚本输出一个包含所有用户的XML文档:
$sql = "SELECT * FROM users "; // add order statement if needed
$query = mysql_query($sql);
$login_counter = mysql_num_rows($query);
$xml = array('<?xml version="1.0" encoding="UTF-8"?><users>');
if ($login_counter > 0) {
while ($data = mysql_fetch_array($query)) {
$xml[] = '<user name="'.$data['username'].'" bio="'.$data["user_bio"].'" />';
}
}
else {
// do nothing
// you will handle it on the flash side by checking the length of user nodes list
}
$xml[] = '</users>';
header('Content-Type:text/xml');
die(implode('', $xml));
这将输出一个XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user name="..." bio="..." />
<user name="..." bio="..." />
[...]
</users>
(PHP上有类,比如SimpleXML,以更清洁的方式处理XML)
AS Side:
您可以借助XML / XMLList类轻松浏览/显示闪存方面的数据
只需调整URLLoaderDataFormat
到TEXT
并将数据转换为完整事件处理程序中的XML:
var xml:XML = new XML(event.target.data);
然后迭代用户元素以显示它们:
var users:XMLList = xml.user;
var user:XML;
for (user in users) {
trace('name->' + user.attribute('name') );
trace('bio->' + user.attribute('bio') );
}