Impossible de retourner ocrrectment une variable d'un Fichier PHP vers Flash

Résolu
devboman Messages postés 16 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 1 décembre 2009 - 25 nov. 2009 à 13:35
devboman Messages postés 16 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 1 décembre 2009 - 26 nov. 2009 à 00:20
Bonjour. -------------- (Message d'un newbie FLASH/AS) ---------------
Configuration de mon poste travail :
- ADOBE Flash CS4 Professionnel
- Server EasyPhp version : 2.0.0.0
- Microsoft Visual Studio 2008. (Edition php)
Voila mon souci.
J'ai trouvé sur votre site un SRC qui devait répondre à toutes mes attentes. La source se trouve ICI.
Le problème que je rencontre, est que je n'arrive jamais à retourner correctement la variable status du fichier PHP. J'ai toujours la même erreur : this.status = undefined
En effet lorsque je debug l'AS les variables qui sont retournées vers à Flash sont de cette nature: voir l'image plus bas.
La connexion sur la base est opérationnelle, car utilisée dans un SRC PHP/Html pour mon site internet.
J'ai mis en entête du fichier com.php du source originel le symbole "<?php" en lieu et place de l'original qui était "<?" .
Peut-on m'expliquer ou mon problème se situe? Peux être un problème de comptabilité...
Merci de vos réponses.

11 réponses

Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011
25 nov. 2009 à 17:14
Hello,
Du côté php, qu'obtiens tu en faisant un echo de tes POST ?
Peut-on avoir le code de traitement PHP ?

-- Orange73 --

"L'homme n'est pas fait pour travailler, la preuve c'est que cela le fatigue" (Voltaire)
3
devboman Messages postés 16 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 1 décembre 2009
25 nov. 2009 à 18:10
Bonjour.

Lorsque j'appelle le fichier PHP « com.php » depuis une page teste « index.html » j'obtiens la réponse escomptée :
status=ok&name0=ID&name1=mark&l0c0=1&l0c1=Aprilia&l1c0=2&l1c1=B.....48&l47c1=Voxan&l48c0=49&l48c1=Yamaha&l49c0=50&l49c1=Zongshen
Donc le 'echo' me retourne bien le 'status' positionné correctement et ensuite suivent les arguments de ma base.
Je te poste les deux fichiers.

Le ficher "index.html" appelant le fichier php incriminé :
------------------------------------------------------------------------------
<html>

<FORM NAME="Marque" METHOD="post" ACTION="com.php" >






</form>

</html>
------------------------------------------------------------------------------

Le Fichier appelé "com.php"
------------------------------------------------------------------------------
<?php
//chaine renvoyée à la fin à flash
$toflash = "status=";

if (isset($_POST['serverName']) and
isset($_POST['serverLogin']) and
isset($_POST['serverPassword']) and
isset($_POST['DBName']) and
isset($_POST['requete']))
{

//toutes les variables sont bien arrivées de flash à php
//------------------- connection au server --------------------
if (!mysql_connect($_POST['serverName'],$_POST['serverLogin'],$_POST['serverPassword']))
{
$toflash .= "Impossible de se connecter à la base !";
echo $toflash;
exit;
}

//-------------- connection à la base de donnée ---------------
mysql_select_db($_POST['DBName']);


//------------------ execution de la requete ------------------
if (!($requete = mysql_query(stripslashes($_POST['requete']))))
{
//si la requete est érronée
$toflash .= "Attention, La requète contient des erreurs !";
echo $toflash;
exit;
}

//si la requete est correcte, on extrait le premier mot de la requete
ereg("^[a-zA-Z]+",$_POST['requete'],$requete_type);

//si c'est une requete qui modifie ou ajoute qqch dans la table
if ($requete_type[0] == "DELETE" or $requete_type[0] == "UPDATE" or $requete_type[0] == "delete" or $requete_type[0] == "update"){
//alors on quitte, c'est fini, fin de traitement
$toflash .= "0";
echo $toflash;
exit;
}

//------- remplissage de la variable à renvoyer à flash -------
$toflash .= "ok";

//nombre de colonne dans la requete selectionnée
$nb_champs = mysql_num_fields($requete);

//pour chaque colonne on extrait son nom
for ($i=0;$i<$nb_champs;$i++)
{
$toflash .= "&name$i=".mysql_field_name($requete, $i);
}

//on extrait les données de toute la table (par exemple : l1c2 = ligne 1, colonne 2)
$j=0;
//pour chaque ligne j
while ($req_result = mysql_fetch_row($requete))
{
//pour chaque colonne i
for ($i=0;$i<$nb_champs;$i++)
{
$toflash .= "&l$j"."c$i"."=".$req_result[$i];
}
$j++;
}

}
else
{
//message d'erreur, une variable n'est pas arriver au fichier php
$toflash .= "Erreur lors de la transmission des donnes de flash vers php !";
}
//---- Renvoie des données à flash par la commande "echo" -----
echo $toflash;
?>
------------------------------------------------------------------------------

Merci de me tenir au courant.
Cordialement, Devboman
3
Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011
25 nov. 2009 à 19:42
Et si tu change
this.status

par une autre variable car "status" devient bleu car il est deja defini en tant que variable native de flash, peut-etre donc un litige ?


-- Orange73 --

"L'homme n'est pas fait pour travailler, la preuve c'est que cela le fatigue" (Voltaire)
3
devboman Messages postés 16 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 1 décembre 2009
25 nov. 2009 à 19:48
Je vais tester de ce pas en changeant l'intitulé de cette variable et reviens pour te tenir au courant.
Merci en attendant.

Devboman
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
devboman Messages postés 16 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 1 décembre 2009
25 nov. 2009 à 19:56
Bonsoir.
Et voila testé!
J'ai remplacé le nom de la variable "status" du fichier PHP par "StatusPhp" et biensur j'ai changé le nom de la variable côté AS toujours par le nom de la variable retournée du PHP par "this.StatusPhp"
Rien!! Cette variable, n'apparait toujours pas dans le debuggeur, côté variables locales, et de part le fait pas possible de la tester.
J'obtiens toujours :
**** PHP : undefined

Devboman
3
Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011
25 nov. 2009 à 20:00
Si tu fais un
trace(this.status);

au debut de ta fonction onLoad avant le if()
qu'obtiens tu ?


-- Orange73 --

"L'homme n'est pas fait pour travailler, la preuve c'est que cela le fatigue" (Voltaire)
3
devboman Messages postés 16 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 1 décembre 2009
25 nov. 2009 à 20:08
J'obtiens toujours "undefined"
Je te poste le SRC AS qui est un fichier AS contenant ma class Loadvars
Dans celle-ci tu verras le teste du StatusPhp retourné par le PHP.

Fichier PHPSQL.AS
--------------------------------------------------------
/*

UTILISATION DANS ACTION SCRIPT :

new PHPSQL(server_name, server_login, server_password, db_name); Constructeur du gestionnaire avec les parametres de connection
setServerName(sn : String) : Void Change le nom du serveur
setServerLogin(sl : String) : Void Change le login de connection
setServerPassword(sp : String) : Void Change le mot de passe de connection
setServerDBName(sdbn : String) : Void Change le nom de la base de donnée
request(req : String) : Void Envoie une requete au gestionnaire

onRequest(success:Boolean) : Void Est invoqué une fois que le résultat de la requête est disponible. Les 3 fonctions ci dessous sont alors effectives

getColumnsName() : Array Retourne un tableau des noms de colonnes, ou un tableau vide si aucun resultat, ou null si erreur
getResultAssoc() : Array Retourne un tableau associatif de toutes les lignes, ou un tableau vide si aucun resultat, ou null si erreur
getResult() : Array Retourne un tableau de toutes les lignes/colonnes, ou un tableau vide si aucun resultat, ou null si erreur

*/

/**
* Créer le 25 Novembre 2006.
* CLASSE PHPSQL
* Permet la gestion de requete SQL via flash en passant par php mais entierement simplifié vu de flash.
* La classe permettra toute sorte de requetes, et renverra les données sous forme simplifiées.
* @author schiouff (kc)
* @version 1.0
*/

class PHPSQL extends LoadVars
{

//%%%%%%%%%%%%%%%%%%%%%%%%%%%% VARIABLES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%

private var serverName : String;
private var serverLogin : String;
private var serverPassword : String;
private var DBName : String;
private var requete : String;
private var resultColomnsName : Array;
private var resultAssoc : Array;
private var result : Array;


//%%%%%%%%%%%%%%%%%%%%%%%%%%% CONSTRUCTEUR %%%%%%%%%%%%%%%%%%%%%%%%%%%

public function PHPSQL (server_name : String, server_login : String, server_password : String, db_name : String)
{
super();
serverName = server_name;
serverLogin = server_login;
serverPassword = server_password;
DBName = db_name;
}



//%%%%%%%%%%%%%%%%%%%%%%%%%%%% METHODES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%

public function request(req : String) : Void
{
clear();
//on ajoute la variable de requete
requete = req;
//on envoie les variables au fichier php. En attente de reception...
sendAndLoad("com.php", this, "POST");
}

private function onLoad(success:Boolean) : Void
{
trace(this.StatusPhp);
var i,j : Number;
if (success)
{
//le fichier php a été trouvé et lu
if (this.StatusPhp == "ok")
{
//on a reçu les données de la requete
//>>>>>>>>>> Exploitation des données reçues <<<<<<<<<<
i = 0;
//creation d'un tableau contenant le nom des champs
resultColomnsName = new Array();
while (this["name"+i] != undefined)
{
resultColomnsName[i] = this["name"+i];
this["name"+i] = undefined;
i++;
}
//creation des tableaux associatif ou non
resultAssoc = new Array();
result = new Array();
j = 0;
i = 0;
//pour chaque colonne i
while (this["l"+j+"c"+i] != undefined)
{
resultAssoc[resultColomnsName[i]] = new Array();
result[i] = new Array();
//pour chaque ligne j
while (this["l"+j+"c"+i] != undefined)
{
resultAssoc[resultColomnsName[i]][j] = this["l"+j+"c"+i];
result[i][j] = this["l"+j+"c"+i];
this["l"+j+"c"+i] = undefined;
j++;
}
j = 0;
i++;
}
onRequest(true);
}
else
{
if (this.StatusPhp == "0")
{
//la requete ne renvoie pas de résultat
resultColomnsName = new Array(0);
resultAssoc = new Array(0);
result = new Array(0);
}
else
{
//un probleme est survenue dans la requete
trace("**** PHP : "+this.StatusPhp);
}
onRequest(true);
}
}
else
{
//le fichier php n'a pas pu être lu
onRequest(false);
}
}

//A définir par l'utilisateur
public function onRequest(success:Boolean) : Void
{
trace("OnRequest undefined ! you may define this method if you want to get results :");
trace("obj_PHPSQL.onRequest = function (succes : boolean) { ... }");
}


private function clear() : Void
{
//on initialise les tableaux ( hope there is a GC )
resultColomnsName = null;
resultAssoc = null;
result = null;
}


public function getColumnsName() : Array
{
return resultColomnsName;
}
public function getResultAssoc() : Array
{
return resultAssoc;
}
public function getResult() : Array
{
return result;
}


public function setServerName(sn : String) : Void
{
serverName = sn;
}
public function setServerLogin(sl : String) : Void
{
serverLogin = sl;
}
public function setServerPassword(sp : String) : Void
{
serverPassword = sp;
}
public function setServerDBName(sdbn : String) : Void
{
DBName = sdbn;
}
}
--------------------------------------------------------
Cordialement, Devboman
3
devboman Messages postés 16 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 1 décembre 2009
25 nov. 2009 à 20:09
Je te post l'AS qui importe la class.

L'AS du FLA
-------------------------------------------------------------
import PHPSQL;
//
//Attention à la sécurite dans les identifiants
//( cette source n'est pas là pour traiter la sécurité )
gestionnaireDeRequete = new PHPSQL("localhost", "root", "", "moto");
//
//invoqué lors de la reception du résultat d'une requete
gestionnaireDeRequete.onRequest = function(succes)
{
if (succes && (this.getResult() != null))
{
//si la lecture du fichier php a reussi
//et que la requete a reussie
_root.info_msg = "OK ! no pb !";
fill_data_grid(this);
/*
Au retour, 3 tableaux sont disponibles :
-- this.getColumnsName();
----- est un tableau qui contient les noms des colonnes
-- this.getResultAssoc();
----- est un tableau associatif, c'est à dire que
----- ["nom_de_colonne"][1] renvoie la case 1 de la colonne nom_de_colonne
-- this.getResult();
----- est un tableau, c'est à dire que
----- [2][1] renvoie la case 1 de la colonne 2
*/
}
else
{
_root.info_msg = "Error !";
}
};
//fonction pour le bouton envoyer
envoyer.onRelease = function()
{
//on demande une requete à la base de donnée
gestionnaireDeRequete.request(requete);
};
//fonction qui remplie la datagrid
function fill_data_grid(gdr)
{
//on efface tout
datagrid.removeAllColumns();
//c'est reparti
dataTab = new Array();
for (ligne=0; ligne<gdr.getResult()[0].length; ligne++)
{
obj = new Object();
for (col=gdr.getResult().length-1; col>=0; col--)
{
obj[gdr.getColumnsName()[col]] = gdr.getResult()[col][ligne];
}
dataTab.addItem(obj);
}
datagrid.dataProvider = dataTab;
}
-------------------------------------------------------------


Devboman
3
devboman Messages postés 16 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 1 décembre 2009
25 nov. 2009 à 20:13
Pour l'instant les login password et base de donnée sont dans le FLA.
Côté sécurité et si on arrive à faire fonctionner ce FLA, je changerais l'accés à la base.
Je ne mettrai plus dans le FLA le nom de la base, la table, login et le password.
Ceci se fera par la lecture d'un fichier contenant les données.
Pour l'instant tout est en local donc pas de souci.
Devboman
3
devboman Messages postés 16 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 1 décembre 2009
25 nov. 2009 à 20:28
Je te mets le PRj avec tous les fichiers sur mon serveur ICI.
Cordialement.
Devboman
3
devboman Messages postés 16 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 1 décembre 2009
26 nov. 2009 à 00:20
J'ai trouvé le souci.
Le souci ne vient ni de l'AS ni du PHP.
Le souci vient du type mine de mon server EasyPhp local.

Extrait de la doc Flash_cs4_help.pdf.
Envoi et traitement des données par SendAndLoad :
En règle générale, vous devez traiter les informations avant de les envoyer au serveur pour les mettre en forme de telle sorte que le serveur les comprenne. Quand le serveur reçoit les données, elles peuvent être traitées de façons différentes et renvoyées au fichier SWF dans un format qui lui convient, qui peut varier de paires nom-valeur à des objets complexes.
Remarque : vous devez définir le type MIME de la sortie de votre serveur d'application sur application/x-wwwurlform-encoded. Si ce type MIME est manquant, le résultat est le plus souvent inutilisable quand il parvient à Flash.


J'ai donc supprimé le type mine par défaut du paramétrage PHP d'EasyPhp.
Grace à ceci vous obtenez enfin une chaine de caractère en retour de votre fichier PHP, formatée selon vos souhaits.
- Pour ma part je recevais comme chaine de retour le contenu intégral de mon fichier PHP, soit :
[list]<?php\n$StatusPph=??\n\n?? blablablabla echo $StatusPhp?>/list

- Au lieu de recevoir le format escompté de l'echo, soit :
[list]
StatusPhp=ok&name0=ID&name1=mark&l0c0=1&l0c1=??
/list
Voila pour ce bug pas anodin.

Merci à Orange73 pour m?avoir aidé.

Bien cordialement à vous tous, Devboman
0
Rejoignez-nous