1

私は現在、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.";
}
}
?>

データベースからすべての情報をテーブルに表示する簡単な方法を知っている人はいますか?

4

2 に答える 2

2

PHP コードで改善したい点がいくつかあります (AS3 の方が優れています)。

  • PDO特定の DBMS で機能する関数の代わりに使用します。その理由は、(ある程度) 移植可能だからです。たとえば、データベースを MySQL から Postgres に移行したい場合は、コードの書き換えが少なくて済みますが、そうでない場合は書き換える必要があります。PDO は、入力をサニタイズする手段も提供します。それは防弾ではありません - それでも何もないよりはましです。PDO は「グッド プラクティス」と見なされているため、最初に newby スタイルのコードを記述してから実際に適切に実行する方法を発見するという旅をするのではなく、すぐに優れたコードを記述することを学ぶことができます。単一の選択などの非常に原始的なタスクについて考えている場合は、少し冗長になるかもしれませんが、タスクがもう少し複雑になるとすぐに、時間をかけるだけの価値があります。

  • SQL クエリでは、select *テスト/デバッグの場合を除き、絶対に使用しないという一般的なルールを作成します。それは一種の怠惰であり、最終的には多くの問題が発生します。そうすることで、後でコードを維持することが非常に難しくなり、効果的に「一度書いたら逃げる」ようなものに変わります。繰り返しますが、単純な概念実証としては問題ありませんが、長期的な解決策ではありません。私が言おうとしていることがまだぼやけている場合は、すべての列名を明示的にリストしてください。

  • include/requireとその家族を使用_onceすることは、長期的な解決策としては悪い考えです。繰り返しますが、簡単なテストには問題ありませんが、長期的には悪いです。優れたプログラムは、関数/クラスで記述され、__autoload()クラスを自動的にロードする機能を使用するか、フレームワークを使用します。これにより、大規模なアプリケーションがより管理しやすくなり、インクルードのウェブよりもナビゲートと理解が容易になります。

  • Web アプリケーションのユーザーからの入力をサニタイズする必要があります。つまり、しないでください$_POST['key']。少なくとも、キーが存在することと、それが期待される形式であることの両方をチェックする関数を作成してください。


さて、あなたの実際の問題、データの送信。

  • PHP で取得した未加工の SQL 出力を送信するだけで、サーバーがすべてを再エンコードする問題を回避できます。非常に単純なケースでは機能しますが、より複雑なタスクではより複雑になります。これも一般的ではないため、人々はそれを処理する方法を知らないことに気付くでしょう。(技術的な制限はありません。実際には歴史的なアーティファクトです)。

  • 必要な Flash ではなく、さまざまなアプリケーションで消化できる一般的な形式がたくさんあります。それらには、XML、JSON、Protobuf が含まれます。から作成されたものなど、PHP に特化したものもありますserialize()。このルートをたどる場合は、JSON に固執することを強くお勧めします。XML はより成熟したテクノロジーかもしれませんが、JSON には基本型システムが組み込まれているという利点があります (XML では、その上にもう 1 つのレイヤーが存在します。つまり、Flash では他の要素が実装されていません。 XSLについて)。

  • Flash に最適な AMF (ActionScript Message Format) があります。PHP は、それを生成する方法もよく知っています (いくつかの一般的な実装があります)。この形式は、JSON や XML に比べてはるかにコンパクトです。より表現力があります (循環依存関係、多対多の関係を記述でき、カスタム型、カスタム [逆] シリアル化ルーチンを導入するための手順があります)。カスタムのシリアル化ルーチンを使用しない限り、自己記述型でもあります。JavaScript にはバイナリ データの使用に問題があるため、後でアプリケーションを JavaScript に移行する予定がない場合は、これが最適なオプションです。この形式を解析することはできません。

  • Protobuf も実行可能なオプションです。これは、Google によって設計されたデータ交換形式です。精神的には AMF に似ていますが、自己記述的ではない場合があります。アプリケーションからカスタム オブジェクトを生成する方法をアプリケーションに依存しています。ただし、JavaScript で解析できるフォームがあります (ただし、コンパクトさの利点は失われます)。


ActionScript コード: AMF を選択した場合は、NetConnectionクラスを調べる必要があります。AMFPHP プロジェクトをご覧になることをお勧めします。サンプルもあります。あるいは、Zend Framework にはZend_Amf、その目的で使用されるライブラリがあります。しかし、最初はフレームワーク全体を使用するのは圧倒されるかもしれません。

XML を使用する場合は、組み込みの XML クラスがあり、その使用方法に関する何百万もの例が Web 上にあります。

JSON を使用する場合は、少し前からそのための組み込みクラスもあります。しかし、その前に、それを解析するためのライブラリがいくつかありました。

以前、Flash で Protobuf をサポートするための GoogleCode に関するプロジェクトがありましたが、開始するにはかなりの知識と手作業が必要でした。


最後に、ここで言及されているもののインデックス:

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 Player 用 - このライブラリには、私が知っている中で最高の JSON デコーダーがあります。

于 2013-03-30T13:27:25.457 に答える