<h2>Votre Formation vidéo</h2><br/>
Votre formation est décomposée<br/>
en chapitres très clairs de 20 à 30 min. <h2>Des exemples SWF </h2><br/>
Chaque leçon est accompagnée<br/>
du code source avec le fla et les classes. <h2>Votre Suivi personnalisé</h2><br/>
Vous pouvez  me poser toutes<br/>
vos questions sous les cours vidéos.

Échanger des données entre PHP / MySQL et Flash / AS3

4 questions

Écrit le 1 novembre par Matthieu
Publié dans le(s) sujet(s) Adobe Flash

Mots clés : , , , , , , , , ,

Le Kit du Développeur Flash

Dans cet article, nous allons apprendre Comment échanger des données entre Flash (AS3) et Php / MySQL.

Il y a plusieurs méthodes, la plus simple et efficace consiste à utiliser le Flash Remoting.

Qu’est ce que le Flash Remoting ?

Le Flash Remoting permet des échanges entre un client (flash) et un serveur (php). De plus, il possède un format de données propre : l’AMF pour Action Message Format.

Le format AMF (format binaire) permet, entre autre, d’échanger des variables typées et optimisées. Effectivement, les informations sont sérialisées puis envoyées au serveur (Php).

Pour simplifier : Flash encode les données en AMF et les transmet au serveur. Pour décoder le paquet reçu, le serveur a besoin d’une passerelle remoting.

Installation d’une passerelle Remoting

Dans notre tutoriel nous utiliserons AmfPhp pour dialoguer entre Flash et Php. Téléchargez la dernière version : amfphp 1.9.zip.

Dézippez le contenu sur votre serveur web, dans le dossier ‘www’ par exemple.

Il y a 2 dossiers et 1 fichier important :

  • browser : permet de tester vos services Php.
  • services : contient les Services Php ou classes de communication avec une base de données MySQL.
  • gateway.php : la passerelle à configurer dans votre fichier ActionScript pour lancer la communication de Flash avec Php.

Ensuite, tapez l’url d’accès la passerelle gateway.php, par exemple : http://www.votre-domaine.com/include/remoting/gateway.php

Un message vous indique que l’installation d’Amfphp est réussie.

Puis vous avez la possibilité de :

  • consulter la documentation sur le site Amfphp.
  • lancer le Browser pour tester vos services Php.

Création de la connection entre Flash et Php

Dans votre classe AS3, il suffit de renseigner l’url de la passerelle php (gateway.php). Très simple 🙂

/**
		 * Création de la passerelle de communication avec php
		 */
		private function addRemoting() : void
		{
			// création d'une connection à un service
			oConnection = new NetConnection ();
 
			// Connection avec la passerelle pour communiquer avec AMFPHP
			// (avec php et une base de données MySQL par exemple)
			oConnection.connect("http://www.votre-domaine.com/include/remoting/gateway.php");
 
			/**
			 * Création de l'objet qui permet de communiquer avec votre Service AMFPHP
			 *
			 * @param : fonction appelée en cas de succès de connection à la passerelle AMFPHP
			 * @param : fonction appelée en cas d'échec de connection à la passerelle AMFPHP
			 */
			oRetourPhp = new Responder(succesServeurPhp,echecServeur);
			oRetourMySQL = new Responder(succesServeurMysql,echecServeur);
		}

Les classes AS3 suivantes sont utilisées :

  • import flash.net.NetConnection; Permet d’établir la connection de Flash avec PhP.
  • import flash.net.Responder; Permet de renseigner à Flash, les méthodes AS3 à appeler dès la réception de la réponse de Php.

Échange de données entre Flash et Php

Le fonctionnement est le suivant : le Flash (en AS3) appelle un Service Php (une classe).

Création du Service Php

Sur votre serveur php, dans le répertoire services, créez un fichier php. Dans notre tutoriel, nous l’appellerons FlashRemoting.php.

Dans le constructeur de la classe php FlashRemonting, renseignez le nom des méthodes accessibles depuis flash.

/**
	 * @brief Constructeur de la classe. Initialise les proprietes.
	 *
	 */
	public function __construct()
	{
		// permet de recuperer le contenu d'une page du flash en fonction du bouton du menu choisi
		$this->methodTable = array
		(
			"getDate" => array
			(
				"description" => "",
				"access" => "remote",
				"arguments" => "array",
				"returns" => "array"
			)
		);
	}

Ensuite, il reste à implémenter votre script php dans la méthode getDate().

getDate() interroge le serveur php pour récupérer sa date tout simplement.

/**
	 * @param -
	 * @return -
	 */
	public function getDate($oMsg)
	{
		$nTimestamp = time(); //Affiche le nombre de secondes écoulées depuis le 1er janvier 1970
 
		$date = date("d-m-Y");
		$heure = date("H:i:s");
		$sDateFr = $date." ".$heure;
 
		$aResult = array();
		$aResult["timestamp_php"] = $nTimestamp;
		$aResult["date"] = $sDateFr;
		$aResult["message"] = $oMsg;
		return $aResult;
	}

Dans la méthode getDate(), vous remarquerez l’ajout d’un paramètre en entrée.

C’est un objet envoyé par Flash, puis Php le retourne à Flash. C’est un exemple pour vous montrer cette possibilité : le contenu de cet objet peut être ajouté dans une base de données par exemple…

Test du service avec le browser

Une fois votre service Php crée, vous pouvez le tester avec le browser d’Amfphp.

Tapez l’url d’accès la passerelle gateway.php, par exemple : http://www.votre-domaine.com/include/remoting/gateway.php

Et cliquez sur Load the service browser.

amfphp browser

Cette interface en Flash vous permet :

  • de détecter les erreurs de syntaxe PhP.
  • d’appeler les méthodes de votre service Php.
  • d’effectuer des tests de performances de votre serveur Php.

Appel de PhP à partir de Flash

En AS3, vous utilisez l’instance de la classe NetConnection pour appeler votre passerelle Php.

private function appelPhp(e:MouseEvent) : void
		{
			// création de l'objet transmit en paramètre à php
			var oInfo:Object = new Object();
			oInfo.nom = "ActionScript-Facile.com";
			oInfo.numero = Math.floor( Math.random()*69 );
			oInfo.timestamp_flash = Math.floor(new Date().getTime()/1000);
 
			m_textField.htmlText = "Communication avec PHP en cours :)";
 
			/**
			  * Appel d'une méthode de notre classe PHP.
			  * Localisée dans le fichier services\flashremoting\FlashRemoting.php
			  *
			  * @param : chemin complet d'appel de la méthode php
			  * @param : l'objet qui récupère les réponses de php
			  * @param : paramètre à transmettre à la méthode php
			  */
			oConnection.call("flashremoting.FlashRemoting.getDate", oRetourPhp, oInfo);
			// si tous ce passe bien le serveur répond (succesServeurMysql) sinon appel de la méthode echecServeur...
		}

L’instance de la classe Responder indique à Flash les méthodes à appeler en cas de connection réussie ou d’échec.

Vous remarquerez l’ajout du Logger pour afficher du Debug dans Firefox (très pratique)!

La méthode succesServeurPhp reçoit l’objet directement envoyé par la méthode getDate() de la classe Php FlashRemoting.

private function succesServeurPhp(oResult:Object):void
		{
			// affiche des messages de debug dans firefox
			Logger.debug("Connection à la passerelle AMFPHP réussie!");
			Logger.debug("timestamp_flash : " + oResult.message.timestamp_flash);
			Logger.debug("Date reçue de php : " + oResult.date);
			Logger.debug("timestamp_php : " + oResult.timestamp_php);
 
			m_textField.htmlText = "Sur le serveur php N°<b>"+oResult.message.numero+" - "
			+ oResult.message.nom+ "</b>, nous sommes le " + oResult.date +
			".\nLe temps écoulé est de " + oResult.timestamp_php +".";
		}

Echanger des données entre flash

et une base de données MySQL

Sur le même principe, Flash peut communiquer avec une base de données, de type MySQL par exemple.

Dans votre service Php, vous implémentez vos requêtes MySQL, c’est aussi simple que cela!

J’ai ajouté à ce tutoriel la classe Mysql.php. Elle possède quelques fonctionnalités bien sympathiques. Je vous laisse les découvrir par vous même.

La classe Mysql.php est commentée, et avec des exemples d’utilisation.

Création d’un compteur de visite en Flash

Nous allons créer un compteur de visites en Flash.

Le Flash va interroger la base de données Mysql via Php pour mettre à jour et afficher le nombre de visiteurs de l’application.

Tout d’abord, renseignez les données de connection à votre base dans la classe Mysql.php

Mysql.php   
/**
	 * @brief
	 * @param -
	 */
	public function __construct()
	{
		$this->aConnect 	= array();
		$this->aConnect['ip']	= "nom_serveur"; // le serveur
		$this->aConnect['login']= "login"; // le login
		$this->aConnect['password'] = "mot_passe"; // mot de passe
		$this->aConnect['database'] = "nom_base"; // nom de la base de donnee
		$this->aConnect['port'] = "3306";
 
	 }

Puis exécutez ces requêtes sql sur votre base de données (via phpmyadmin).

--
-- Table structure for table `compteur_visite`
--
 
CREATE TABLE `compteur_visite` (
  `compteur` double NOT NULL DEFAULT '0',
  `date` date NOT NULL DEFAULT '0000-00-00',
  `time` int(9) NOT NULL DEFAULT '0',
  `duree` int(9) NOT NULL DEFAULT '0',
  `ip` varchar(50) NOT NULL DEFAULT '0',
  PRIMARY KEY  (`ip`),
  KEY `compteur` (`compteur`,`date`),
  KEY `date` (`date`),
  KEY `duree` (`duree`),
  KEY `time` (`time`)
) ENGINE=MyISAM;
 
INSERT INTO `compteur_visite` (
`compteur` ,
`date` ,
`time` ,
`duree` ,
`ip`
)
VALUES (
'0', '0000-00-00', '0', '24', 'compteur'
);

Ensuite, ajoutez un nouvel accès dans le constructeur de votre service php. Ainsi que la création de la connection à la base de données.

/**
	 * @brief Constructeur de la classe. Initialise les proprietes.
	 *
	 */
	public function __construct()
	{
		// permet de recuperer le contenu d'une page du flash en fonction du bouton du menu choisi
		$this->methodTable = array
		(
			"getDate" => array
			(
				"description" => "",
				"access" => "remote",
				"arguments" => "array",
				"returns" => "array"
			),
 
			"getVisitCount" => array
			(
				"description" => "",
				"access" => "remote",
				"arguments" => "array",
				"returns" => "array"
			)
		);
 
		// ajout des classes php
		require_once("Mysql.php");
 
		// connection à la base de données mysql
		$this->oSqlConnection = new Mysql();
	}

Ensuite, vous implémentez les différentes requêtes sql nécessaires dans votre service Php.

/**
	 * @brief Récupère le nombre de visiteur sur le site actuellement, met à jour le compteur également.
	 * @param -
	 * @return -
	 */
	public function getVisitCount()
	{
		/* init des variables */
		$n_nbVisiteur = 0;
		$n_nbVisiteurToday = 0;
		$n_nbVisiteurNow = 0;
 
		//on recupere l adresse ip du visiteur
		if($_SERVER)
		{
			if($_SERVER['HTTP_X_FORWARDED_FOR'])
				$sIpAdress = $_SERVER['HTTP_X_FORWARDED_FOR'];
			elseif($_SERVER['HTTP_CLIENT_IP'])
				$sIpAdress = $_SERVER['HTTP_CLIENT_IP'];
			else
				$sIpAdress = $_SERVER['REMOTE_ADDR'];
		}
		else
		{
			if(getenv('HTTP_X_FORWARDED_FOR'))
				$sIpAdress = getenv('HTTP_X_FORWARDED_FOR');
			elseif(getenv('HTTP_CLIENT_IP'))
				$sIpAdress = getenv('HTTP_CLIENT_IP');
			else
				$sIpAdress = getenv('REMOTE_ADDR');
		}
 
		$sDate = date("Y-m-d");
		//on convertit l heure courante en minute d une journee
		$sTime = (date("H") * 60) + date("i");
 
		$s_sqlSelect = "SELECT compteur, date, time, duree FROM compteur_visite WHERE ip = 'compteur' LIMIT 1";
		$o_sqlResult = $this->oSqlConnection->query($s_sqlSelect);
		$o_result = $this->oSqlConnection->getObject($o_sqlResult);
		$n_nbVisiteur = $o_result->compteur;
 
		$iTimeConnexionRef = $o_result->time; //temps de connexion de reference
		$iDurationRef = $o_result->duree; //duree de renouvellement de reference
		$sDateBDD = $o_result->date;
 
		//on test si on a changé de jour
		if ( $sDate!=$sDateBDD )
		{
			$s_sqlDelete = "DELETE FROM compteur_visite WHERE ip!='compteur'";//on vide toutes les addresses ip enregistrées dans la table lors du changement de jour
			$o_sqlResult = $this->oSqlConnection->query($s_sqlDelete);
			$s_sqlUpdate = "UPDATE compteur_visite SET date='$sDate'";//on met a jour la nouvelle date dans la table
			$o_sqlResult = $this->oSqlConnection->query($s_sqlUpdate);
		}
 
		//on verifie l adresse ip du visiteur et aussi son heure de passage
		$s_sqlSelect = "SELECT compteur, date, time, duree FROM compteur_visite WHERE ip='$sIpAdress' LIMIT 1";
 
		// excecute la requete sql
		$o_sqlResult = $this->oSqlConnection->query($s_sqlSelect);
		// recupere le resultat renvoyee par la requete
		$o_result = $this->oSqlConnection->getObject($o_sqlResult);
 
		if( $o_result->compteur == NULL)
		{
			//on enregistre l adresse ip si elle est inconnu et on incremente le compteur
			$s_sqlInsert = "INSERT INTO compteur_visite (ip,time,duree) VALUES ('$sIpAdress','$sTime','$sTime')";
			$o_sqlResult = $this->oSqlConnection->query($s_sqlInsert);
			$n_nbVisiteur +=1;
			$s_sqlUpdate = "UPDATE compteur_visite SET compteur=$n_nbVisiteur WHERE ip='compteur' LIMIT 1";
			$o_sqlResult = $this->oSqlConnection->query($s_sqlUpdate);
		}
		else
		{
			// si l'adresse ip est connu alors verifie si sa connexion precedente est superieur a la durée
			// de renouvellement et si son heure de passage precedente incremente ou pas les connectés
			$sTimeVisit = $o_result->time;//on recupere l'heure de sa precedente connexion de notre connecté
			$sDurationVisit = $o_result->duree;//on recupere l'heure de sa precedente connexion de notre connecté
 
			// on verifie si sa derniere connexion ne date pas de plus que la duree de reference
			if( $iDurationRef*60 < ( $sTime - ($sDurationVisit) ) )
			{
				//si la duree de reference est depassé alors notre connecté est comptablisé
				//comme nouvelle visite et on met a jour sa nouvelle heure de passage
				$s_sqlUpdate = "UPDATE compteur_visite SET time=$sTime, duree=$sTime WHERE ip='$sIpAdress' LIMIT 1";
				$o_sqlResult = $this->oSqlConnection->query($s_sqlUpdate);
 
				//on cree une ligne fictive pour pouvoir le comptabiliser dans les connectés de jour
				$sIpAdressV = $sIpAdress.".".$n_nbVisiteur;
				//echo"sIpAdressV : ".$sIpAdressV;
 
				$s_sqlInsert ="INSERT INTO compteur_visite (ip,time,duree) VALUES ('$sIpAdressV','$sTime','$sTime')";
				$o_sqlResult = $this->oSqlConnection->query($s_sqlInsert);
 
				//et on increment le compteur de visite
				$n_nbVisiteur +=1;
				$s_sqlUpdate = "UPDATE compteur_visite SET compteur=$n_nbVisiteur WHERE ip='compteur' LIMIT 1";
				$o_sqlResult = $this->oSqlConnection->query($s_sqlUpdate);
			}
			else
			{
				//on met a jour son heure de passage si elle est superieure a t
				if ( $sTime > ( ($sTimeVisit)-$iTimeConnexionRef ) )
				{
					$s_sqlUpdate="UPDATE compteur_visite SET time=$sTime WHERE ip='$sIpAdress' LIMIT 1";
					$o_sqlResult = $this->oSqlConnection->query($s_sqlUpdate);
				}
			}
 
		}
 
		// on compte le nb de connecté de la journée
		$s_sqlSelect = "SELECT ip FROM compteur_visite WHERE ip!='compteur'";
		// recupere le resultat de la requete SELECT
		$o_sqlResult = $this->oSqlConnection->query($s_sqlSelect);
		// retourne le nombre d'enregistrement renvoyee par la requete SELECT
		$n_nbVisiteurToday = $this->oSqlConnection->getNumRows();
 
		// on compte le nb de connecté
		$sTimeToday = $sTime - $iTimeConnexionRef;
		$s_sqlSelect = "SELECT ip FROM compteur_visite WHERE time >= $sTimeToday AND ip!='compteur' ";
		// recupere le resultat de la requete SELECT
		$o_sqlResult = $this->oSqlConnection->query($s_sqlSelect);
		// retourne le nombre d'enregistrement renvoyee par la requete SELECT
		$n_nbVisiteurNow = $this->oSqlConnection->getNumRows();
 
		$aResult = array();
		$aResult["total"] = $n_nbVisiteur;
		$aResult["today"] = $n_nbVisiteurToday;
		$aResult["now"] = $n_nbVisiteurNow;
		return $aResult;
	}

Voici le code AS3 pour demander à Mysql les informations du compteur de visites.

private function appelMysql(e:MouseEvent) : void
		{
			// création de l'objet transmit en paramètre à php
			var oInfo:Object = new Object();
			oInfo.nom = "ActionScript-Facile.com";
			oInfo.numero = Math.floor( Math.random()*69 );
			oInfo.timestamp_flash = Math.floor(new Date().getTime()/1000);
 
			m_textField.htmlText = "Communication avec MySQL en cours :)";
 
			/**
			  * Appel d'une méthode de notre classe PHP.
			  * Localisée dans le fichier services\flashremoting\FlashRemoting.php
			  *
			  * @param : chemin complet d'appel de la méthode php
			  * @param : l'objet qui récupère les réponses de php
			  * @param : paramètre à transmettre à la méthode php
			  */
			oConnection.call("flashremoting.FlashRemoting.getVisitCount", oRetourMySQL, oInfo);
			// si tous ce passe bien le serveur répond (succesServeurMysql) sinon appel de la méthode echecServeur...
		}

Et pour terminer, la méthode AS3 appelée par le Php. Nous utilisons les informations de la base de données, à travers un objet envoyé par Php.

/**
		 * Appelée dans le cas d'une communication réussie avec mysql
		 */
		private function succesServeurMysql(oResult:Object):void
		{
			// affiche des messages de debug dans firefox
			Logger.debug("Connection à la passerelle AMFPHP réussie!");
			Logger.debug("Total des visites : <b>"+oResult.now);
			Logger.debug("Nombre de visiteur aujourd'hui : " + oResult.today);
			Logger.debug("Nombre de connectés : " + oResult.now);
 
			m_textField.htmlText = "Total des visites : <b>"+oResult.total+"</b>\n" +
			"Nombre de visiteur aujourd'hui : <b>" + oResult.today +
			"</b>\nNombre de connectés : <b>" + oResult.now +"</b>.";
		}

Conclusion

Et voici le résultat avec les Composants Button du Framework AS3 Facile.

https://www.actionscript-facile.com/wp-content/uploads/2010/10/remoting_exemple.swf

Sources Commentées

Vous trouverez ci-dessous l’ensemble des classes créées. Elles sont commentées pour vous permettre de comprendre au mieux leur fonctionnement.

Le fichier zip contient également le logiciel AMFPHP en version 1.9 😉

Vous pouvez télécharger le fichier zip :

TÉLÉCHARGEZ Flash Remoting AS3 / Php / MySQL (AMFPHP 1.9 inclus)

(Déjà téléchargé 785 fois - Taille : 532.83 kB)

Flash Remoting AS3 / Php / MySQL (AMFPHP 1.9 inclus)

Quelle technique préférez-vous utiliser pour échanger des données entre Php et Flash ?

Partagez-les ci-dessous avec l’ensemble des Développeurs ActionScript. Il y a des solutions plus rapides à mettre en place avec les classes AS3 :

  • URLVariables.
  • URLRequest.
  • URLLoader.


Développez des Jeux et Applications Flash avec la Formation AS3 Facile !

Recevez Gratuitement Des Cours en Vidéos, des codes source et des livrets de formation.
Et en bonus gratuit : Le Framework AS3 Facile ! 


4b690a744c72912c8e6a05f0fedf9796SSSSSSSSSSSSSS