Forums Développement Multimédia

Les formations Mediabox
Les formations Mediabox

Exemple simple d'une connection mysql flash avec amfphp

Compatible ActionScript 2. Cliquer pour en savoir plus sur les compatibilités.Compatible PHP. Cliquer pour en savoir plus sur les compatibilités.

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 :

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.