【问题标题】:Retrieving Information from MySQL via PHP to AS3通过 PHP 从 MySQL 检索信息到 AS3
【发布时间】:2013-03-29 18:47:57
【问题描述】:

我目前正在做一个在 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.";
}
}
?>

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

【问题讨论】:

  • $sql = "SELECT * FROM users"
  • 您好,我了解 SELECT * FROM 用户。但是,我不是 100% 知道如何在表格中显示这个
  • 您想要 HTML 表格还是 Flex 表格(IE 数据网格)?
  • 抱歉回复晚了。我认为这将是一个数据网格,因为闪存将在 iPad 上使用
  • 确保 Flash 可以在 iPad 上运行。您将需要 Air2.5 或更高版本。

标签: php mysql actionscript-3 flash


【解决方案1】:

您可能希望在 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 for Protobuf 在 Flash 中支持的项目,但它需要相当多的知识和体力劳动才能开始。


最后,这里提到的事情的索引:

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.htmlZend_Amf 库

http://code.google.com/p/protobuf-actionscript3/ActionScript 中的 Protobuf

https://github.com/drslump/Protobuf-PHPPHP Protobuf (抱歉,没用过这个,但是看起来不错)

http://www.blooddy.by/en/crypto/ 用于旧版本的 Flash 播放器 - 这个库有我所知道的最好的 JSON 解码器。

【讨论】:

    【解决方案2】:

    最好的方法是(我认为)使用 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 方面:

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

    只需将 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') );
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      相关资源
      最近更新 更多