Exemple simple d'une connection mysql flash avec amfphp
L’objectif de ce tuto est de faire un survol avec un exemple simple et bien documenté d’une connexion à une base de données MySQL avec flash remoting et amfphp. Le tout encapsulé dans une classe AS pour qu’à l’utilisation, tout soit transparent pour l’utilisateur de la classe.
Dans notre exemple, nous aurons une table 'membres' dans notre DB MySQL. Nous aurons donc une classe 'Membre' dont chaque instance correspondra à un élément de cette table 'membres'. Pour chaque table nous ferons donc une nouvelle classe pour communiquer avec sa table correspondante.
Pré-requis :
- Les composants de flash remoting doivent être installés (http://www.adobe.com/products/flashremoting/downloads/components/).
- Il faut avoir installé et démarré un serveur virtuel pour interpréter le PHP (easyphp, wamp, …).
- Les librairies amfphp doivent être téléchargées et placées dans le répertoire localhost.
- Conseillé : avoir regardé le tuto amfphp à cette adresse : http://www.flashxpress.net/content/view/270/77/ (en bas de page).
- Avoir des connaissances de bases en AS, en PHP et en MySQL.
Au final ;
Voici ce que l’utilisateur de la classe 'Membre' devra faire pour récupérer les infos de la table 'membres' de la DB MySQL.
//import de notre classe Membre.as import Membre; //on défini une instance de notre classe Membre //qui correspondra au membre dont l'id vaut 1 dans la DB MySQL var monMembre:Membre = new Membre(1); //écouteur var ecouteur:Object = new Object(); //fonction qui sera exécutée quand notre écouteur entendra l'événement "pwouet" //que l'on aura défini dans notre classe Membre et qui sera déclenché quand le //chargement des infos du membre sera fini ecouteur.pwouet = function(evtObj:Object):Void { //voilà on a récupéré le nom du membre de manière transparente question accès DB et (amf)PHP. trace(evtObj.membre.nom); trace(evtObj.membre.age); } //on ajoute un écouteur sur notre membre pour qu'il réagisse à l'événement "pwouet" monMembre.addEventListener("pwouet",ecouteur);
Comme tu peux le constater, c'est très facile de récupérer les infos de la DB.
Mais bien sûr il reste à faire la classe et tout ce qui se trouve derrière (PHP).
N'aie pas peur, on va y aller étape par étape.
Etape 0 : création de la DB MySQL et de la table membres
Je ne vais pas rentrer dans les détails de cette étape. On crée un nouvelle DB qu'on appelle MyDB et dans celle-ci on ajoute une table qu'on appelle membres avec les champs suivants :
id (int clé primaire auto-incrément) nom (varchar(100) not null) age (int not null). Et on ajoute au moins un membre dedans avec le nom et l'age qu'on veut.
Etape 1 : création du service PHP (amfphp)
Dans le répertoire services de amfphp (qui doit donc se trouver dans le répertoire défini comme racine de localhost), on crée un nouveau fichier AccesDB.php.
Et voici le code à mettre dedans :
<?php class AccesDB{ //constructeur de la classe, syntaxe obligatoire pour amfphp //(bien expliqué dans la vidéo sur amfphp dont le lien est dans les pré-requis) function AccesDB(){ $this->methodTable = array ( "loadMember" => array ( "description" => "recupère les infos d'un membre dans la DB MySQL", "access" => "remote" ) ); } //fonction qui permet de récupérer les infos d'un membre function loadMember($id){ //connexion à la DB MySQL avec nom d'hôte, login et password (ceux-ci sont les valeurs par défaut pour easyphp) $db = mysql_connect("localhost","root",""); //on choisit la base de données sur laquelle on va travailler : MyDB dans notre exemple mysql_select_db("MyDB", $db); //requête SQL pour sélectionner l'élément de la table membres dont l'id est celui qu'on a reçu en paramètre $result = mysql_query("select * from membres where id = ".$id); //tableau qui contiendra le résultat de la requête et qui sera récupéré dans la classe Membre.as $data = array(); //on sélectionne le 1er item du résultat de la requête (et il ne doit y en avoir qu'une vu que l'id est unique) $row = mysql_fetch_array($result); //on remplit notre tableau avec les infos de l'item sélectionné (qui est un membre de la table) //id $data["id"] = $row["id"]; //nom $data["nom"] = $row["nom"]; //age $data["age"] = $row["age"]; //on ferme la connexion à la DB mysql_close($db); //et on renvoie les infos qui seront récupérées dans la classe Membre.as return $data; } } ?>
Etape 2 : création de la classe Membre.
On commence par créer un nouveau fichier actionscript que l'on nomme Membre.as.
Voici le code à mettre dedans avec toutes les explications qui vont avec :
//classes permettant d'utiliser le remoting (après avoir installé les composants) import mx.remoting.Service; import mx.remoting.PendingCall; //classe pour la gestion d'événements import mx.events.EventDispatcher; //classe qui permettra de récupérer les infos d'un membre dans la DB MySQL //et qui encapsulera ces infos de manière transparente class Membre { //l'id du membre courant dans la base de données MySQL //(-1 si c'est un nouveau membre qu'on va ajouter) private var nId:Number; //le nom du membre courant private var sNom:String; //l'âge du membre courant private var nAge:Number; //variables à déclarer pour utiliser la classe EventDispatcher private var dispatchQueue:Function; private var dispatchEvent:Function; public var addEventListener:Function; public var removeEventListener:Function; //Objet qui définira l'événement qu'on enverra //(pour qu'il puisse être entendu par un écouteur à un autre endroit) private var loadEvent:Object; //constructeur pour faire des beaux pti membres :-) //nId est l'id du membre à aller rechercher dans notre DB MySQL public function Membre(nId:Number){ //on initialize notre gestionnaire d'événements mx.events.EventDispatcher.initialize(this); //on définit l'événement (qui sera un "pwouet") sur notre membre (this) loadEvent = {target:this,type:"pwouet"}; //AMFPHP : on définit la connexion à notre classe PHP via la passerelle PHP //(AccesDB est la classe PHP qu'on vient de créer à l'étape 1) var maConnexion:Service = new Service("http://localhost/gateway.php", null, "AccesDB"); //appel à la méthode loadMember(id) de notre classe PHP et //comme le traitement est asynchrone, on définit un PendingCall "myPC" //qui préviendra quand le traitement PHP sera fini var myPC:PendingCall = maConnexion.loadMember(nId); //on définit une variable de type Membre pour y stocker le Membre courant //et pouvoir y accéder quand on sera dans la fonction liée à notre PendingCall var item:Membre = this; //code qui sera exécuté quand le PendingCall prévient que le traitement PHP est fini //et qu'on a donc bien récupéré les infos pour pouvoir les utiliser //(ces infos sont stockées dans pData) myPC.onResult = function(pData){ //on a les infos sur le membre dans pData (qui dans notre exemple //est un tableau associatif contenant le nom et l'id du membre) //on définit la propriété 'nom' de notre membre item.sNom = pData["nom"]; //on définit la propriété 'age' de notre membre item.nAge = pData["age"]; //on définit la propriété 'id' de notre membre item.nId = pData["id"]; //on stocke notre membre dans l'objet loadEvent (que l'on récupérera //à l'endroit où on entendra l'événement) item.loadEvent.membre = item; //on déclenche l'événement (pwouet dans notre exemple) item.dispatchEvent(item.loadEvent); } } //NOM public function set nom (s:String) { sNom = s; } public function get nom ():String { return sNom; } //AGE public function set age (n:Number) { nAge = n; } public function get age ():Number { return nAge; } //ID public function set id (n:Number) { nId = n; } public function get id ():Number { return nId; } }
Voilà, c'est fini ! C'était pas si compliqué pas vrai ? Tu peux maintenant utiliser la classe quand tu le souhaites pour récupérer les infos que tu veux. Bien sûr, tu peux rajouter des méthodes dans la classe AS (et les correspondants dans le service PHP) pour ajouter, modifier, supprimer des membres dans ta DB.
Et de cette façon, ton code AS dans ton anim est très light et clair.
