1

我目前正在做一个在 TutsPlus 上找到的教程。本教程是通过 PHP 将信息从 AS3 保存到 MySQL,然后检索此信息。

到目前为止,它有效。I 可以输入用户名和分数,保存到数据库中。但是有一个问题,我希望能够在表格中显示所有名称和分数,而不必搜索名称然后找到该特定用户的分数。

保存信息的代码(有效)如下。

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.";
}
}
?>

有没有人知道任何简单的方法可以将数据库中的所有信息查看到表中?

4

2 回答 2

2

您可能希望在 PHP 代码中改进一些事情(您的 AS3 更好)。

  • 使用PDO而不是使用特定 DBMS 的函数。这样做的原因是它是可移植的(在一定程度上)。比如说,如果你想将数据库从 MySQL 迁移到 Postgres,你必须重写更少的代码,否则你就不得不这样做。PDO 还提供了一些清理输入的方法。它不是防弹的 - 总比没有好。PDO 被认为是“良好实践”,因此您将立即学习编写良好的代码,而不是从一开始编写新风格的代码,然后发现如何正确地做到这一点。如果您正在考虑一个非常原始的任务(例如单次选择),它可能会更冗长一些,但是一旦您的任务变得稍微复杂一点,它就变得值得花时间。

  • 在您的 SQL 查询中制定一条永远不要使用的一般规则select *,除非用于测试/调试。这是一种懒惰,最终会给你带来很多问题。通过这样做,您将很难在以后维护您的代码,从而有效地将其转换为“一次编写 - 跑路”之类的东西。同样,作为一个简单的概念证明,它是好的, - 长期解决方案 - 不好。如果您仍然对我要说的内容感到困惑:明确列出所有列名

  • 使用include/require和他们的_once家人作为长期解决方案是一个坏主意。同样,对于一个简单的测试来说还可以——从长远来看是不好的。好的程序是用函数/类编写的,并使用__autoload()或使用自动加载类的能力的框架。这使得更大的应用程序比包含的网络更易于管理、更容易导航和理解。

  • 您必须清理来自 Web 应用程序用户的输入,即不要这样做$_POST['key']。至少编写一个函数来检查密钥是否存在以及它是否具有预期的格式。


现在,您的实际问题是发送数据。

  • 您可以只发送您在 PHP 中获得的原始 SQL 输出 - 将使您的服务器免于重新编码所有这些的问题。在非常简单的情况下工作,但随着更复杂的任务变得更加复杂。这也是不常见的,所以你会发现人们不知道如何处理。(没有技术限制,它只是一个真正的历史文物)。

  • 有一堆流行的格式可以被各种应用程序消化,而不是 Flash。其中包括 XML、JSON、Protobuf。还有一些更特别的 PHP,比如从serialize(). 如果你走这条路,我会敦促你坚持使用 JSON。XML 可能是一种更成熟的技术,但 JSON 具有内置的基本类型系统的好处(而在 XML 中,它是在它之上的另一层,也就是说,除了其他东西之外,它没有在 Flash 中实现 - 我在说关于 XSL)。

  • 有 AMF(ActionScript 消息格式)——它是 Flash 的理想选择。PHP 也非常清楚如何生成它(那里有几种流行的实现)。与 JSON 或 XML 相比,这种格式要紧凑得多。它具有更强的表达能力(可以描述循环依赖、多对多关系、具有引入自定义类型的过程、自定义 [反] 序列化例程)。它也是自描述的,除非您使用自定义序列化例程。如果您以后不打算将应用程序迁移到 JavaScript,这是最好的选择,因为 JavaScript 在使用二进制数据时存在问题。在那里解析这种格式是不可能的。

  • Protobuf 也是一个可行的选择。这是谷歌设计的一种数据交换格式。它在精神上与 AMF 相似,但它可能不是自我描述的。它依赖于应用程序来了解如何从中生成自定义对象。然而,它有一个可以在 JavaScript 中解析的形式(尽管你会失去紧凑性的好处)。


您的 ActionScript 代码:如果您选择 AMF,则需要查看NetConnection课程。我建议你看看 AMFPHP 项目——它也有例子。或者,Zend 框架有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)。

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 解码器。

于 2013-03-30T13:27:25.457 回答
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)

作为侧:

借助 XML/XMLList 类,您可以轻松浏览/显示 Flash 端的数据

只需在完整的事件处理程序中适应并将数据转换为 XML URLLoaderDataFormatTEXT

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') );

}
于 2013-03-30T12:06:27.227 回答