Forums Développement Multimédia

Les formations Mediabox
Les formations Mediabox

Envoi et récupération d'une requete SELECT

Compatible ActionScript 2. Cliquer pour en savoir plus sur les compatibilités.Compatible PHP. Cliquer pour en savoir plus sur les compatibilités.Par Aggelos (Clément Arnoux), le 24 novembre 2004

Article issu du forum, écrit par Aggelos le 24 nov 2004

Réalisation : une classe AS2 permettant de récuperer les résultat d'une requete mySQL de façon transparente

Pré-requis : Avoir lu des bases en DOM XML, php et AS2 (voir les tutos)

Ce tuto je l'espère très complet vous permettra d'utiliser quelques techniques avancées, en créant une classe AS2 permettant d'envoyer des requetes MySQL sans toujours refaire le script coté PHP. Bien qu'il soit possible d'utiliser cet outil sans le comprendre, ça n'a pas beaucoup d'interet, je vous conseille d'essayer par vous même de l'améliorer ensuite (c'est possible) ou de le personnaliser pour vos besoins.

Tout d'abord, ce qu'il faut savoir :

  • Flash ne peut pas communiquer vers le serveur, il faut donc une couche de langage serveur, PHP ou ASP sont une solution
  • Structurer un résultat est quand même sacrément plus pratique en XML
  • Flash sait interpreter le XML sur le modele document objet

L'idée alors est que si du coté PHP je peux avoir un résultat sous la forme

<resultat_xml>
	<result_1>
		<id>10</id>
		<nom>Roger</nom>
	</result_1>
	<result_2>
		<id>11</id>
		<nom>Henri</nom>
	</result_2>
</resultat_xml>

il me sera assez simple de le transformer en tableau de résultats sous flash

XML

Il faut imaginer le XML comme un arbre. Il y a la racine, dont le seul fils est resultat_xml resultat_xml a deux fils, ayant chacun deux fils, ayant chacun un fils (oui, tout ce qui se trouve entre deux balises est un noeud de type texte, des noeuds qui n'ont pas de nom, mais une valeur)

PHP

Commençons donc par le PHP

function parseQuery($requete)
 
{ 
 
  $i=1; 
 
  //$str sera un string XML, encodé UTF8 
 
  $str = "<?xml version='1.0' encoding='UTF-8'?><result_xml>"; 
 
  //envoi de la requete a la base 
 
  $result = mysql_query($requete) or die('Erreur SQL !<br>'.$this->s_query.'<br>'.mysql_error()); 
 
 
 
  //s'il y a un resultat : 
 
  if($n_result) { 
 
  //pour chaque ligne de resultat 
 
  while($data = mysql_fetch_object($result))
 
  { 
 
      //on ouvre une balise <result_i></result_i> 
 
      $str .= "<result_".$i.">n"; 
 
      //pour chaque colonne de resultat 
 
 
 
      foreach($data as $ident=>$valeur)
 
      { 
 
         //on cree un element      <nom_colonne>valeurresultat</nom_colonne> 
 
          $str.="<".$ident.">".utf8_encode($valeur)."</".$ident. ">n"; 
 
      } 
 
      $str .="</result_".$i.">n"; 
 
      $i++; 
 
    } 
 
 
 
  } 
 
  $str.="</result_xml>";
 
  //voila, on renvoie le XML correctement terminé 
 
  echo $str; 
 
}

donc, ici, deux petites choses a savoir pour bien comprendre

1°) mysql_fetch_object renvoie UNE ligne de résultat, sous forme d'objet, et va sur la suivante while($o_result = mysql_fetch_object($result)) permet donc de parcourir tous les resultats de la requete ligne par ligne

2°) foreach est une methode qui est identique au for in de flash

Vous verrez dans les sources que j'ai inclus cette méthode dans une classe PHP, pour faire quelque chose de plus propre cette classe est appelée par l'autre page PHP via un require(); Certaines variables ont donc un nom différent, etant déclarées comme variables d'instance (par exemple $data deviendra $this→data). La classe PHP contient également des méthodes de connection a la base mySQL que je vous conseille de bien étudier.

AS2

Le broadcast d'evenement

Vous trouverez la classe mx.events.EventDispatcher dans le repertoire classes de Flash.

Elle permet d'initialiser un objet comme étant un emetteur d'evenements. Elle est donc tres pratique pour creer une classe qui genere des evenements. Rappelons qu'une classe “statique” (par opposition a dynamique) ne peut avoir d'autres variables que celles qui sont déclarées.

L'idée derriere broadcasterMX est d'ajouter a un objet 4 methodes (addEventListener, removeEventListener, dispatchQueue, dispatchEvent). Il faut donc veiller a les déclarer, sinon le compilateur va raler.

D'ou en debut de classe les lignes

private var dispatchQueue:Function;
private var dispatchEvent:Function;
public var addEventListener:Function;
public var removeEventListener:Function;

Notez que dispatchEvent est privée, afin que personne ne puisse l'utiliser a des fins malhonnetes ou déconseillées.

on cree un objet evenement onLoad :

private var loadEvent:Object;

voila, donc maintenant initialisons le broadcast, ce qui veut dire en debut de classe un

import mx.events.EventDispatcher;

et dans le constructeur :

mx.events.EventDispatcher.initialize(this);

qui signifie que l'objet est initialisé pour le broadcast

La fonction sendAndLoad

En soit c'est la seule chose vraiment complexe ici. Comprenez ca et vous avez compris le reste.

Etape 1 : verification de la requete

On verifie qu'on a bien une requete SELECT. Pour cela, on prend les 7 premieres lettres du string requete, et on les met en majuscule, pour pouvoir les comparer au string “SELECT”.
En cas d'erreur, le comportement choisi est assez violent ;-) : on envoie carrément une erreur (pour ceux qui connaissent en Java, c'est une exception) qui bloquera l'execution du script si le developpeur qui ecrit la requete est indelicat

Etape 1 : declaration des variables d'instance

Il faut initialiser le tableau et le l'emetteur afin d'etre sur de n'envoyer et recevoir QUE les bonnes informations

var a_result:Array = new Array();
var sender:LoadVars = new LoadVars();
var o_receiver:XML = new XML();
var o_receiver.ignoreWhite = true;

cette derniere ligne est facultative, mais je la considere comme une bonne manie

Etape 2 : declaration des informations a envoyer :

un LoadVars d'envoi envoie l'ensemble des propriétés qui lui ont été ajoutées comme parametres POST vers le PHP

ex : si j'ai mon_lv.test = 'ok';
et que je fais mon_lv.send(“mapage.php”);
dans mapage.php je pourrai recuperer $_POST['test'] dont la valeur est 'ok'
donc ici :

sender.query = query;
sender.base = base;
sender.pass = pass;
sender.user = user;
sender.host = host;

Attention : le tableau $_POST est trié en sens inverse !!!!!

Etape 5 : Analyser les données receptionnées par le rrecepteurs

Il faut faire cela des le moment ou les données sont recues, mais pas avant, pour etre sur qu'elles existent. On fait donc ca dans la fonction onLoad, déclenchée par l'evenement onLoad

a) reception du XML

Je vous invite a regarder les différents tutoriels sur la forme que doit avoir le XML généré par le PHP pour bien gérer le UTF8 8-)

b) tableau des lignes de réponse

Regardons a nouveau l'arbre XML. Chaque ligne de réponse correspond à un fils du fils de la racine. Le tableau des fils d'un noeud est noeud.childnodes. On va donc s'interesser uniquement a ce tableau la et declarer chaque ligne comme un objet (comme pour mySQL_fetch_object en PHP)

var x_xml:XMLNode = this.firstChild.childNodes;
 
for(var i:Number=0;i<x_xml.length;i++)
 
{
 
	var ligne:Object = new Object();

et on recupere les enfants, qui sont les colonnes retournée

	var hop:XMLNode = x_xml[i].childNodes;//ici donc [id,nom];

c) recuperation des valeurs et stockage dans le tableau de résultat

for(var j:Number=0;j<hop.length;j++)
 
	  {
 
	  ligne[hop[j].nodeName] = hop[j].firstChild.nodeValue;
 
	  }
 
	  sql.a_result[i] = ligne;
 
}

Tout a déja été expliqué : pour chaque resultat, on prend chaque enfant, qui a un nom, et etant donné que son fils est un noeud texte, celui ci a une valeur.

On rajoute donc a la ligne autant d'attributs qu'il y a de colonnes, chaque attribut contenant un string valeur

ici :

ligne.id = 10
ligne.nom = Roger

par exemple

Enfin, on dit que la ligne[i] du tableau de resultat est ligne

d) Resultat et signal d'evenement

on a donc a_result[i].id et a_result[i].nom pour chaque ligne.

il faut signaler qu'on a obtenu un resultat, avec un evenement onLoad

d'ou les lignes

sql.loadEvent.result = sql.result;
sql.dispatchEvent(sql.loadEvent);

la premiere ligne signifie que l'on donne a l'objet evenement que l'on va envoyer une propriété qui est le fameux tableau de resultats qu'on a généré

La deuxieme est simplement l'envoi de l'objet.

comment est-ce que ca se traduit ? soit mes_requetes une instance de MySQL_Query

var obj:Object = new Object();
 
obj.onLoad = function(evtObj:Object):Void
 
{
 
//evtObj.result est mon tableau de resultats, accessible ici
 
}
 
mes_requetes.addEventListener("onLoad",obj);

Etape 4 : Envoyer, et récupérer

La classe LoadVars possède son propre sendAndLoad qui prend l'URL de la page cible, et un recepteur comme parametres

sender.sendAndLoad(php,receiver);

Toujours faire ca apres avoir declaré le comportement de chargement !! Si vous ne prenez pas cette habitude vous allez venir debiter des anneries sur le forum ;-)

Petite astuce, meme si l'aide Flash dit que le recepteur doit etre un LoadVars, il n'en est rien, un XML fait l'affaire

C'est l'astuce employée ici

CONCLUSION

Voila, avec tous ces elements vous avez les bases pour concevoir des outils permettant une bonne intéraction avec mySQL, ainsi que des notions evenementielles en AS2. J'espere avoir été assez clair, mais je reste a votre disposition sur toute eventuelle question sur ce tuto. Toute a quelques exceptions : je n'expliquerai pas comment on utilise cet outil, si vous avez bien tout suivi et que vous avez lu les autres tutos, vous saurez le faire tout seul.

Si vous avez des améliorations à proposer, la aussi je suis ouvert a discussion.

ps les noms de variables ont été changé dans ce tutoriel afin d'avoir une meilleure compréhension