Forums Développement Multimédia

Les formations Mediabox
Les formations Mediabox

Communiquer avec une base de données en Actionscript via PHP/MySQL

Compatible ActionScript 3. Cliquer pour en savoir plus sur les compatibilités.Par Nataly, le 11 octobre 2010



Bonjour, et bienvenue sur les sentes de l'accès aux bases de données depuis Flash.

Ce tuto est à ranger dans la catégorie pied à l'étrier. Vous y trouverez de quoi accéder à une base, lire des enregistrements et (dans la deuxième partie) comment les modifier.


ActionScript, à l'origine des temps du début de l'Histoire, permettait de programmer des animations.
De fil en release le langage est devenu chaque fois plus puissant et on s'est habitués à en attendre à peu près tout.
Cependant, dès qu'on dépasse la simple animation et qu'on commence à cheminer dans les horizons applicatifs - il est d'ailleurs intéressant de noter comment les projets flash, dont on parlait de façon générique en employant le terme animation, ont peu à peu, viré vers la terminologie application…
Quand on dépasse la “simple” animation donc, on a vite besoin de stocker (et d'accéder à) des données en dehors du fla.
Pour beaucoup, qui dit données dit base.

C'est pourquoi je me propose ici de débroussailler le chemin vers les bases de données - à grand coup de serpe, vous peaufinerez ;)

Il sera question du langage PHP dans ses quelques balbutiements fondamentaux, de ses fonctions MySql les plus couramment utilisées et de requêtes SQL.

Pour suivre cette opération de débroussaillage, vous n'aurez besoin (outre un coupe-coupe) que d'une pratique courante de Flash, même pas de connaissances en matière de classes, tout sera mis en exemple sur un fla.
Il faut aussi que vous sachiez créer une base.
Et que vous disposiez à tout le moins d'un éditeur de texte pour les fichiers .php (même notepad ferait l'affaire).
Il sera question de tableaux, vous pouvez vous rafraichir la mémoire ici.


Précautions Oratoires d'Usage
Je ne suis pas plus un maitre du PHP que du SQL (que de rien d'ailleurs mais ne le répétez pas, j'ai une réputation1) à entretenir) aussi devrez vous considérer les lignes SQL à titre d'exemple et non comme une Vérité Absolue et Inaltérable.


Attention toute fois : S'il est courant de commencer à apprendre les bases de php sans trop se soucier de la sécurité, précise 3akycka en relisant ce tuto, il faut tout de même prendre quelque précautions élémentaires

Je vous encourage donc à lire la suite sur le sujet dédié ;)


Puisque vous avez tout, en route pour la base !

PHP/MySQL

Wikipédia nous raconte en détail ce qu'est PHP.

Pour résumer en deux mots et du point du vue qui nous intéresse : PHP (historiquement Personal Home Page) c'est un langage de script qui s'exécute côté serveur et qui permet de générer des pages web dynamiques (tout ou partie).

Vu qu'une page web n'est rien d'autre qu'un fichier texte (interprété par un navigateur) et que Flash - pardon AS3 - sait lire des données depuis un fichier texte, voilà qui nous donne une idée du biais par lequel on va avoir recours aux services de PHP.
Il suffira de lui faire écrire les données dans un format qui nous arrange et de les utiliser.
On pourra donc, selon notre humeur ou les contraintes, choisir d'afficher des paires variable/valeur (URLVariables) ou du texte entre balises façon xml.

Au fond ça râle : ”Il suffira de lui faire écrire les données… Elle est gentille la fille ! Mes données à moi elle sont dans une base, quel rapport avec PHP ?”

Le rapport c'est MySQL (en tous cas dans ce tuto).

Nous allons utiliser les fonction MySQL de PHP pour interroger une base, rapatrier les données de notre choix et les présenter de telle façon que nous pourrons en tirer le meilleur parti. Selon le même principe nous pourrons modifier ajouter ou supprimer des enregistrements.
Bien sûr ça implique que vous ayez quelques notions de SQL, le reste je détaillerai au besoin.

Envoyer et recevoir des données : principe

Avant de nous énerver avec MySQL on va commencer par apprivoiser PHP.

Télécharger les données

A vos clavier : créez un fichier .php avec le minimum vital pour nos premières expérimentations et publiez le sur le serveur (local ou distant)

<?php 
   echo "Mon premier php";
?>


Je rappelle à toutes fins utiles qu'un fichier php, c'est un fichier texte avec l'extension .php, n'importe quel éditeur de texte fera l'affaire.

Du coté de flash on se propose, dans un premier temps, d'en lire le contenu.
On va avoir recours aux classes URLLoader et URLRequest.

var chargeur:URLLoader=new URLLoader();
// L'adresse du .php
var urlRq:URLRequest=new URLRequest("http://localhost/TutosMB/Demo.php");
 
// un écouteur sur le chargeur
chargeur.addEventListener(Event.COMPLETE,qdFini);
 
// chargez !
chargeur.load(urlRq);
 
// la fonction de rappel
function qdFini(e:Event) {
  trace(e.target);
  trace(e.target.data);
}
[object URLLoader]
Mon premier php

Et voilà le travail :)
Pas plus, et on a accès au contenu du fichier php via la propriété data de l'objet URLLoader.

Prenez garde aux lignes vides

Dans le fichier .php, soyez vigilants à ne pas laisser trainer des lignes vierges avant ou après les balises :


Si maintenant on lit le fichier (comme ci-dessus) en encadrant la valeur de retour d'un caractère quelconque pour bien voir :

function qdFini(e:Event) {
  trace("-"+e.target.data+"-");
}


voici ce que vous constatez :

-
 
Mon premier php
-

Hé oui ! Les lignes vierges sont retournées… Ça pourrait nuire sérieusement par la suite ;)

Envoyer des variables

Accéder au contenu d'un fichier PHP, c'est gentil, mais encore faut-il pourvoir lui envoyer des variables à traiter. Il faudra bien à un moment ou à un autre lui préciser la table à lire, le champ sur lequel faire une recherche…
On dispose pour ce faire de la classe URLVariables qui s'utilise conjointement à la propriété data de URLRequest.

var chargeur:URLLoader=new URLLoader();
var urlRq:URLRequest=new URLRequest("http://localhost/TutosMB/Demo.php");
// un chaine de variables passées par couple variable/valeur séparés par esperluette
var vars:URLVariables=new URLVariables("nom=Machin&age=12");
// on enverra avec la méthode POST
urlRq.method=URLRequestMethod.POST;
// les données à transmettre 
urlRq.data=vars;
 
chargeur.addEventListener(Event.COMPLETE,qdFini);
chargeur.load(urlRq);


Le fichier PHP recevra deux variables nom et age.

<?php 
   echo "j'ai récupéré ".$_POST['nom'].' et '.$_POST['age'];
?>

la fonction de rappel reste la même pour nos tests :

function qdFini(e:Event) {
  trace(e.target);
  trace(e.target.data);
}
[object URLLoader]
j'ai récupéré Machin et 12


Une syntaxe alternative

var chargeur:URLLoader=new URLLoader();
var urlRq:URLRequest=new URLRequest("http://localhost/TutosMB/Demo.php");
 
// ------> ICI ça change <-------------
// un objet URLVariables
var vars:URLVariables=new URLVariables();
// Les variables
vars.nom="machin";
vars.age="12";
// ------> fin modifs <-------------
 
 
// on enverra avec la méthode POST
urlRq.method=URLRequestMethod.POST;
// les données à transmettre 
urlRq.data=vars;
 
chargeur.addEventListener(Event.COMPLETE,qdFini);
chargeur.load(urlRq);

Format de réception des données

la classe URLLoader expose une propriété dataFormat qui permet de préciser le format selon lequel on compte recevoir les données téléchargées.
la classe URLLoaderDataFormat nous donne trois constantes pour déterminer le mode de réception : BINARY, TEXT, VARIABLES.

TEXT

C'est le format par défaut, nous venons à l'instant de le constater avec la chaine “j'ai récupéré Machin et 12”.

D'aucun pourraient penser que ce n'est pas bien utile. En fait si, et on peut déjà anticiper un peu :
Imaginons que PHP ait fabriqué une chaine avec les enregistrements du champ nom dans une table clients et qu'on ait pris soin de séparer les noms par ## (ou n'importe quelle chaine identifiable de notre choix)…
Du côté AS3 il suffit d'appliquer la méthode split (classe String) à la-dite chaine pour récupérer un tableau remplit des noms de la table client.

function qdFini(e:Event) {
  var tab:Array=e.target.data.split("##");
  trace(tab[0]);
}

Pour les St Thomas vous pouvez vous y essayer dès maintenant avec une bête ligne de ce type dans le PHP ;)

<?php 
   echo "zéro##un##deux##trois";
?>


VARIABLES

Voilà qui peut aussi nous être bien utile puisque les données seront transmises au format variable de code URL (paires nomVariable=valeur séparées par le caractère '&').

Pour tester, une ligne dans le php :

<?php 
  echo "nom=Machin&prenom=Françoise";
?>


Du côté AS3, au chargement rien de neuf si ce n'est renseigner la propriété :

chargeur.dataFormat=URLLoaderDataFormat.VARIABLES;


A la lecture, la propriété data de l'objet URLLoader renvoie un objet URLVariables qui contient les variables d'URL codées dans le php.
Dit autrement, avec le php considéré, on dispose des deux propriétés nom et prenom (chargeur.data.nom et chargeur.data.prenom)

var chargeur:URLLoader=new URLLoader();
var urlRq:URLRequest=new URLRequest("http://localhost/TutosMB/Demo.php");
 
// On veut récupérer les données au format variable de code URL
chargeur.dataFormat=URLLoaderDataFormat.VARIABLES;
 
chargeur.addEventListener(Event.COMPLETE,qdFini);
chargeur.load(urlRq);
 
function qdFini(e:Event) {
    // accès à nom et prénom directement en tant que propriété de data
    trace(e.target.data.nom+" "+e.target.data.prenom);
}



Lire le contenu d'une table et l'afficher


Composants List, Combo, Grid… : Rappel


Avant d'attaquer les hostilités, si besoin était de vous rafraîchir la mémoire quant à l'utilisation de ces composants, je vous propose d'ajouter une instance de l'un ou de l'autre (ça se mange pareil) sur la scène2).
Disons que vous l'avez nommé laListe.

Pour la remplir on utilise le plus souvent un fournisseur de données : un objet DataProvider qui renseigne la propriété dataProvider du composant concerné.

Il existe de nombreuses techniques pour parvenir à nos fins, petit récap :

addItem

Créer un objet DataProvider :

var dp:DataProvider= new DataProvider();


Lui ajouter des items :

dp.addItem({label:"Pomme",data:25, otchoz:"Golden"});
dp.addItem({label:"Cerise",data:14,otchoz:"Bigarreau"});
dp.addItem({label:"Orange",data:48, otchoz:"Navel"});

Renseigner la propriété dataProvider :

laListe.dataProvider=Dp;

On peut, selon le même principe, utiliser directement la méthode addItem du composant :
laListe.addItem({label:"Pomme",data:25, otchoz:"Golden"});

Depuis un tableau

var tab:Array=new Array({label:"un"},{label:"deux"},{label:"trois"},{label:"quatre"});
var dp:DataProvider= new DataProvider(tab);
laListe.dataProvider=dp;

… et on aurait pu faire encore plus simplement :

var tab:Array=new Array["un","deux","trois","quatre"];
var dp:DataProvider= new DataProvider(tab);
laListe.dataProvider=dp;



Depuis un XML

Vous pouvez encore choisir d'exploiter un format XML :

var DonneesXML:XML = <Produits>
        <item label="Pomme" data="25"  otchoz="Golden"  />
        <item label="Cerise" data="14" otchoz="Bigarreau" />
        <item label="Orange" data="48" otchoz="Navel" />
        <item label="Abricot" data="150" otchoz="nr" />
        <item label="banane" data="9" otchoz="nr" />
    </Produits>;

Exactement semblable dans le rendu :

var DonneesXML:XML = <Produits>
        <item> 
            <label> Pomme </label>
            <data> 25 </data>
            <otchoz> Golden </otchoz>  
        </item>
        <item> 
            <label> Cerise </label>
            <data> 14 </data>
            <otchoz> Bigarreau </otchoz>  
        </item>
   </Produits>;


Construire un fournisseur de données, toujours selon le même principe :

var dpx:DataProvider = new DataProvider(DonneesXML);
laListe.dataProvider=dpx;


Afficher le contenu d'un champ dans List ou Combo

Maintenant qu'on a les idées claires, et à titre de mise en jambes, je vous propose d'afficher dans une liste (déroulante ou non) le contenu du champ titre d'une table TPhotos.

La table

Imaginons cette table :



On veut remplir une liste du contenu du champ titre :


Les fichiers PHP


Puisque AS3 ne sait pas interroger une base, il va demander à PHP de s'en charger. Lequel PHP va bien gentiment lui rendre ce service en générant une chaine construite comme ça nous arrange.

Pour ce premier exemple disons qu'on souhaite récupérer les titres séparés par ##, histoire d'en faire simplement un tableau (split, vous vous souvenez) à passer au constructeur d'un DataProvider.

Parametres de connexion

Pour accéder à une base, il faut d'abord s'y connecter… ;)
S'y connecter ça signifie fournir à chaque fois les mêmes infos : le nom du serveur, le nom utilisateur, le mot de passe, le nom de la base… Autant le faire une bonne fois pour toutes dans un fichier .php spécifique, qu'on appèlera en préliminaire à toute opération d'accès à la base. On se contente d'y valoriser des variables qu'on utilisera ensuite à notre gré.

ParametresConnexion.php

<? 
$serveur="localhost";
$utilisateur="root";
$motDePasse="XXXXX";
$base="demoMB";
?>

Le fichier chargé

La première ligne inclut le fichier ParametresConnexion.php dans le script (require_once).
On peut ensuite se connecter à l'aide de la fonction mysql_connect et sélectionner la base à l'aide de l'identifiant de connexion retourné (un canal).

les connexions ouvertes dans un script via mysql_connect sont automatiquement fermées de fin de script : pour plus d'info sur les différences mysql_connect / mysql_pconnect consulter la doc.


Le résultat de l'exécution (réussie) d'une requête SELECT peut être indifféremment lu par les fonctions mysql_fetch_row, mysql_fetch_assoc, mysql_fetch_object, mysql_fetch_array.
Toutes les méthodes se valent notamment du point de vue des performances 3)
Ici, j'ai choisi fetch_row.
Comme les autres elle lit l'enregistrement courant dans $result et avance le pointeur sur la ligne suivante.
Quand il n'y a plus d'enregistrement, elle retourne faux.

Demo.php

<?php 
// Les paramètres 
require_once("ParametresConnexion.php");
// Selection de la base 
        $idConnect = mysql_connect($serveur, $utilisateur, $motDePasse);
	mysql_select_db($base,$idConnect);
	$nomTable = TPhotos;
	$nomChamp= titre;
 
// Chaine SQL --------------------	
	$chSQL = 'SELECT '.$nomChamp.' FROM '.$nomTable ;
	$result = mysql_query($chSQL, $idConnect);
 
 
//	Fabriquer la chaine de sortie
	while($enreg =mysql_fetch_row($result)){
		  $sortie.=$enreg[0]."##";
	}
	// supprimer les caractères excédentaires
        // pour détail de la fonction : http://fr.php.net/substr  
    $sortie=substr($sortie,0,-2);
 
    echo $sortie;
?>


Des ballons##Un château##Jolie rose


Pour déboguer le php, ou plus prosaïquement voir ce qu'il retourne, vous pouvez saisir l'adresse directement dans votre navigateur préféré (par exemple ):
http://localhost/TutosMB/Demo.php

Et ben voilà, yapuka remplir la liste :)

import fl.data.DataProvider;
 
var chargeur:URLLoader=new URLLoader();
// adresse du php
var urlRq:URLRequest=new URLRequest("http://localhost/TutosMB/Demo.php");
 
chargeur.addEventListener(Event.COMPLETE,qdFini);
chargeur.load(urlRq);
 
 
function qdFini(e:Event) {
        // un tableau depuis la chaine de retour
	var tabPhotos:Array=e.target.data.split("##");
        // Le fournisseur de données
	var dpPhotos:DataProvider=new DataProvider(tabPhotos);
        // remplir la liste
	lstPhotos.dataProvider=dpPhotos;
}

Plus de souplesse

L'exemple ci-dessus lit toujours le champ titre de la table TPhotos, ce serait plus malin de pouvoir préciser la table et le champ lus depuis Flash.
Puisqu'on sait envoyer des variables à un fichier .php, on ne va se priver de cette petite sophistication :

Dans flash il suffit d'ajouter trois lignes :

import fl.data.DataProvider;
 
var chargeur:URLLoader=new URLLoader();
var urlRq:URLRequest=new URLRequest("http://localhost/TutosMB/Demo.php");
// -- ici ----------------------
var vars:URLVariables=new URLVariables("table=TPhotos&champ=legende");
urlRq.method=URLRequestMethod.POST;
urlRq.data=vars;
// -----------------------------
 
chargeur.addEventListener(Event.COMPLETE,qdFini);
chargeur.load(urlRq);

Et dans le php guère plus :

<?php 
 
require_once("ParametresConnexion.php");
 
       $idConnect = mysql_connect($serveur, $utilisateur, $motDePasse);
	mysql_select_db($base,$idConnect);
//----> ici on valorise avec les variables envoyées plutôt qu'"en dur"
	$nomTable = $_POST['table'];
	$nomChamp= $_POST['champ'];
//	$nomTable = TPhotos;
//	$nomChamp= titre;
 
// Chaine SQL --------------------	
	$chSQL = 'SELECT '.$nomChamp.' FROM '.$nomTable ;
	$result = mysql_query($chSQL, $idConnect);
 
	while($enreg =mysql_fetch_row($result)){
		  $sortie.=$enreg[0]."##";
	} 
    $sortie=substr($sortie,0,-2);
 
    echo $sortie;
?>
Notez que vous ne pouvez plus tester le résultat de la requête dans le navigateur :( En effet si vous passez les variables dans l'adresse, elles sont transmises en GET (vous pouvez les lire, mais avec la syntaxe $_GET['nomVar']) et non en POST…

TP : Charger la photo choisie dans la liste

Histoire de ne pas alourdir les sources, on va se contenter de remplir une liste déroulante (ça changera) des titres des photos trouvés dans la table TPhotos, et de tracer le nom du fichier associé.
Pour ce qui est de le charger je vous renvoie aux tutos dédiés celui-ci par exemple ;)

Je suppose une instance d'un composant comboBox nommée cboPhotos, et je considère qu'elle sera remplie d'objets exposant les propriétés data pour le nom du fichier, et label pour le titre.

Par défaut c'est le champ label qui est affiché, et on accède à data via selectedItem.

Voici donc le code de la comboBox :

cboPhotos.addEventListener(Event.CHANGE,cboQdChange);
function cboQdChange (e:Event):void {
   trace("nom du fichier : "+e.target.selectedItem.data);
}

Reste à la remplir. Vous savez tout ce qu'il faut pour y parvenir et il y a plusieurs voies possibles.
Je vous laisse vous y essayer.




La proposition suivante utilise le format VARIABLES pour récupérer deux variables : une qui vaut les titres, une autre qui vaut les noms.
Les entrées étant séparées par le caractère '#' un coup de split dessus et on obtient deux tableaux.
Puis on les parcourt pour remplir la liste, directement avec sa propriété additem.

.php

<?php 
require_once("ParametresConnexion.php");
// Selection de la base !
    $idConnect = mysql_connect($serveur, $utilisateur, $motDePasse);
	mysql_select_db($base,$idConnect);
 
 
// Chaine SQL --------------------	
	$chSQL = "SELECT titre, nomFichier FROM TPhotos" ;
	$result = mysql_query($chSQL, $idConnect);
 
	$titre="titre=";
	$nom="nom=";
	while($enreg =mysql_fetch_row($result)){
		  $titre.= $enreg[0]."#";
		  $nom.=$enreg[1]."#";
	}
 
    echo $titre."&".$nom;
?>
titre=Des ballons#Un château#Jolie rose#&nom=ballons.png#chateau.jpg#rose.jpg#

Flash

var chargeur:URLLoader=new URLLoader();
var urlRq:URLRequest=new URLRequest("http://localhost/TutosMB/DemoVarURL.php");
chargeur.addEventListener(Event.COMPLETE,remplitCbo);
// format variable pour récupérer des propriétés
chargeur.dataFormat=URLLoaderDataFormat.VARIABLES;
 
chargeur.load(urlRq);
 
 
function remplitCbo(e:Event) {
	//trace(e.target.data.nom);
        // fabrique deux tableaux pour les noms (fichiers associés) et titres 
	var tabNom:Array=e.target.data.nom.split("#");
	var tabTitre:Array=e.target.data.titre.split("#");
	var i:int;
        // il y a un '#' de trop
	var max:int=tabNom.length-1;
        // remplit la liste
	for (i=0; i<max; i++) {
		cboPhotos.addItem({label:tabTitre[i],data:tabNom[i]});
	}
}

Dans un composant DataGrid

On peut aussi souhaiter afficher plusieurs champs d'une même table, voire de tables en relation. Réjouissez vous : rien de neuf. On a déjà tout vu :)

Les DataGrid se remplissent selon les mêmes techniques que les listes, à l'aide d'un fournisseur de données. Je vais profiter de ce dernier exemple pour illustrer l'écriture d'un .php qui construit une chaine convertible en XML.

Je vous propose donc de remplir une grille (grPhotos) des contenus des champs titre, nomFichier et legende de la toujours même TPhotos.



Une grille et un écouteur

grPhotos.addEventListener(Event.CHANGE,grQdChange);
function grQdChange(e:Event):void {
	trace("Titre "+e.target.selectedItem.titre+" Fichier "+e.target.selectedItem.fichier+" Légende  "+e.target.selectedItem.legende );
}

Un .php qui renvoie une chaine convertible en XML

Là aussi, plusieurs structures possible pour le “futur XML”, je choisis celle-ci :

<donnees>
   <item titre= "Des ballons" fichier= "ballons.png" legende= "Envolée multicolore" />
   <item titre= "Un château" fichier= "chateau.jpg" legende= "une légende pour château" />
   <item titre= "Jolie rose" fichier= "rose.jpg" legende= "Oh ! La jolie rose !" />
</donnees>


Le .php

<?php 
require_once("ParametresConnexion.php");
// Selection de la base !
    $idConnect = mysql_connect($serveur, $utilisateur, $motDePasse);
	mysql_select_db($base,$idConnect);
 
// Chaine SQL --------------------	
	$chSQL = "SELECT titre, nomFichier, legende FROM TPhotos" ;
	$result = mysql_query($chSQL, $idConnect);
 
	$sortie="<donnees>";
	while($enreg =mysql_fetch_row($result)){
		$sortie.="<item ";
		  $sortie.='titre= "'.$enreg[0].'" ';
		  $sortie.='fichier= "'.$enreg[1].'" ';
		  $sortie.='legende= "'.$enreg[2].'" />';
	}
    $sortie.="</donnees>";
    echo $sortie;
?>
Attention
S'il vous venait l'idée de vérifier la sortie php en l'affichant dans votre navigateur, vous pourriez être victime d'une méchante disconvenue !
En effet, vous ne verrez rien :-o
Choisissez la commande Code source de la page du navigateur pour juger du résultat ;)

Depuis Flash


Charger un .php, vous savez maintenant faire par cœur, la seule question à se poser, c'est dans quel format récupérer les données. On a choisi XML, donc c'est du texte, donc rien à préciser (sauf à vouloir y voir clair) puisque c'est par défaut.

var chargeur:URLLoader=new URLLoader();
var urlRq:URLRequest=new URLRequest("http://localhost/TutosMB/DemoFormatXml.php");
chargeur.addEventListener(Event.COMPLETE,remplitGrille);
// par défaut ;)
//chargeur.dataFormat=URLLoaderDataFormat.TEXT;
 
chargeur.load(urlRq);
 
 
 
function remplitGrille(e:Event) {
	trace(e.target.data);
        e.target.removeEventListener(Event.COMPLETE,remplitGrille);
	var DonneesXML:XML=XML(e.target.data);
	var dpx:DataProvider=new DataProvider(DonneesXML);
	grPhotos.dataProvider=dpx;
}

Lire et afficher le contenu de plusieurs tables

Il est bien rare qu'une base contienne une seule table ;)
Imaginons seulement qu'il nous vienne à l'idée d'organiser les photos par catégories, aussitôt déboule une table TCat et la table de relation disons RPhotosCat qui associe photos et catégorie(s) dont elles dépendent.

TCat RPhotosCat

J'admets volontiers que la table RPhotosCat (à droite) n'est pas terriblement facile à lire, d'où la nécessité d'aller chercher dans les tables TPhotos et TCat le contenu des champs titre et nomCat correspondant aux id pour afficher dans Flash quelque chose de plus lisible :

On est d'accord : lire des enregistrements depuis une ou plusieurs tables ne change rien en ce qui concerne AS, puisque tout se joue dans le PHP, via une fonction MySql qui exécute une requête SQL.

SQL d'un peu plus près

Jusque là on n'a utilisé des fonctions SQL (via MySQL) que de très simplistes SELECT FROM, mais il suffit que se pointe une table de relation pour que les choses s'enveniment (un peu… pas de panique).

En français :
J'ai besoin (donc je sélectionne) des champs titre et nomCat
J'irai chercher depuis la table RPhotosCat (que je surnomme R)
les correspondances dans la table TPhotos (que je surnomme P) là où R.idPhoto = P.idPhoto
et dans la table TCat (que je surnomme C) là où R.idCat = C.idCat

$ChSQL = 'SELECT titre, nomCat
			FROM RPhotosCat R
				INNER JOIN TPhotos P
					ON R.idPhoto = P.idPhoto
				INNER JOIN TCat C
					ON R.idCat = C.idCat';

SQL jjointure

Le code

A partir de là plus rien de nouveau, tout le reste on sait faire et on a déjà fait, d'ailleurs. Je vous laisse donc copier/coller/modifier (ou tout re-écrire pour ceux qui pratiquent selon la méthode des gammes ;))

PHP

<?php 
require_once("ParametresConnexion.php");
// Selection de la base !
    $idConnect = mysql_connect($serveur, $utilisateur, $motDePasse);
	mysql_select_db($base,$idConnect);
 
// Chaine SQL --------------------	
	$ChSQL = 'SELECT titre, nomCat
			FROM RPhotosCat R
				INNER JOIN TPhotos P
					ON R.idPhoto = P.idPhoto
				INNER JOIN TCat C
					ON R.idCat = C.idCat';
 
	$result = mysql_query($ChSQL, $idConnect);
	$sortie='<donnees>';
	while($enreg =mysql_fetch_row($result)){
		$sortie.="<item ";
		  $sortie.='Titre= "'.$enreg[0].'" ';
		  $sortie.='Catégorie= "'.$enreg[1].'" />';
	}
 
    $sortie.="</donnees>";
     echo $sortie;
?>


AS

var chargeur:URLLoader=new URLLoader();
var urlRq:URLRequest=new URLRequest("http://localhost/TutosMB/DemoRelation.php");
chargeur.addEventListener(Event.COMPLETE,remplitGrilleCat);
chargeur.load(urlRq);
 
 
function remplitGrilleCat(e:Event) {
	trace(e.target.data);
	var DonneesXML:XML=XML(e.target.data);
	var dpx:DataProvider=new DataProvider(DonneesXML);
	grPhotosCat.dataProvider=dpx;
}

Vers la suite

Vous voilà outillés pour consulter et afficher les données d'une base.

Bien sûr, ça a très peu à voire avec AS, puisque les opérations qui concernent la base elle même sont l'œuvre de requêtes SQL, via MySQL, via PHP…

Bien sûr toujours, pour les opérations d'écriture il en sera de même : le primordial consistera en l'écriture de requêtes appropriées et ce depuis un fichier .php.
De fait, pour la partie AS vous savez tout puisqu'on a vu comment passer des variables

Si vous nêtes pas (ou plus) familiers des manipulations de base (jeu de mots :mrgreen:) je vous invite à consulter la deuxième partie de ce tuto où sont mises en œuvre les opérations d'écriture au sens large (modification, ajout, suppression).

vers la suite : travailler avec les enregistrements

1) ensemble des malentendus accumulés sur son nom
2) évidemment, seul le composant Grid affichera plusieurs colonnes le cas échéant
3) c'est pas moi qui l'ai vérifié, c'est écrit ds mon bouquin, et ce type (Olivier Heurtel) a l'air de savoir de quoi il cause ;)