Pb variable dynamique

Pb variable dynamique - PHP - Programmation

Marsh Posté le 02-06-2008 à 14:55:11    

Bonjour,
 
Je fais des tests pour utiliser les variables dynamiques mais je suis confronter au problème suivant :
 
$racine = simplexml_load_file("http://localhost/test.xml" );
$test = "racine->lien[1]->objet[0]->attribut[0]";
echo "<p>".$$test."</p>";                                                 // Ne marche Pas
echo "<p>".$racine->lien[1]->objet[0]->attribut[0]."</p>";     // Marche ( affiche la valeur concernée)
 
En fait j'ai une première page qui parse un fichier xml avec un formulaire afin de modifier la valeur des attributs du fichier parsé.
La page de réception des données du formulaire doit mettre a jour le xml, pour cela je re-parse l'ancien fichier xml afin d'affecter les nouvelles valeurs.
 
 
Merci d'avance,
 
Adrien


Message édité par babakill le 02-06-2008 à 14:56:37
Reply

Marsh Posté le 02-06-2008 à 14:55:11   

Reply

Marsh Posté le 02-06-2008 à 15:01:53    

$racine->lien[1]->objet[0]->attribut[0] ?? [:autobot]


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 02-06-2008 à 15:04:53    

Je n'essaierai même pas de répondre avant d'avoir une explication acceptable justifiant l'utilisation de cette syntaxe immonde.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 02-06-2008 à 15:06:12    

sielfried a écrit :

$racine->lien[1]->objet[0]->attribut[0] ?? [:autobot]


 
Oui dans mon exemple c'est la valeur que je veux afficher ! Mais je souhaiterais passer par une variable dynamique.

Reply

Marsh Posté le 02-06-2008 à 15:07:31    

babakill a écrit :


 
Oui dans mon exemple c'est la valeur que je veux afficher ! Mais je souhaiterais passer par une variable dynamique.


 
pourquoi tu as besoin de ça?


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 02-06-2008 à 15:08:31    

Voici le xml que je parse :
 
<application id="E7D1E9C6482A05BA" responsable="abx">
<attribut name="Name">ALLOWIN</attribut>
<attribut name="Application Code">ALLOWIN</attribut>
<lien name="Org-Unit" type="Acteur">
<objet id="E7D1E880482A0128" name="ASOSS">
<attribut name="Ordre">1234</attribut>
</objet>
</lien>
<lien name="Processus" type="Processus">
<objet id="E7D1E880482A2222" name="Traitement1">
<attribut name="Ordre">3456</attribut>
</objet>
 
<objet id="E7D1E880482A3333" name="Traitement2">
<attribut name="Ordre">4567</attribut>
</objet>
</lien>
</application>
 
$racine->lien[1]->objet[0]->attribut[0] a donc la valeur 3456

Reply

Marsh Posté le 02-06-2008 à 15:09:09    

oui enfin ça explique toujours pas pourquoi tu aurais besoin d'une variable dynamique, comme tu dis.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 02-06-2008 à 15:09:15    

Reply

Marsh Posté le 02-06-2008 à 15:14:14    

Code :
  1. echo "<p>".(eval('return $'.$test.';'))."</p>";


les variables "dynamiques" marchent très mal avec les tableaux en php ( voir la doc )
 
Maintenant, comme dit plus haut ce genre de chose est une horreur absolue et un motif de flagellation au petit suisse.


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 02-06-2008 à 15:14:34    

Je récupère les nouvelles valeurs dynamiquement, je connais pas leur nom a l'avance.
 
A la suite de mon formulaire, je récupère dans un boucle :  
 
racine->attribut[0] = ALLOWIN
 
racine->attribut[1] = ALLOWIN
 
racine->lien[0]->objet[0]->attribut[0] = 1234
 
racine->lien[1]->objet[0]->attribut[0] = 3456
 
racine->lien[1]->objet[1]->attribut[0] = 4567
 
J'aimerais pouvoir appliquer si il y a lieu les modifs, c'est pour cela que j'aimerais utiliser les variables dynamiques.
 

Reply

Marsh Posté le 02-06-2008 à 15:14:34   

Reply

Marsh Posté le 02-06-2008 à 15:17:38    

Bon, on avance. Il te reste plus qu'à nous expliquer pour quelle raison saugrenue tu ne connais pas le nom de tes variables et on pourra t'expliquer quoi utiliser à la place.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 02-06-2008 à 15:18:07    

anapajari a écrit :

Code :
  1. echo "<p>".(eval('return $'.$test.';'))."</p>";


les variables "dynamiques" marchent très mal avec les tableaux en php ( voir la doc )
 
Maintenant, comme dit plus haut ce genre de chose est une horreur absolue et un motif de flagellation au petit suisse.


 
Ca marche ! Merci beaucoup !

Reply

Marsh Posté le 02-06-2008 à 15:19:38    

anapajari a écrit :

Code :
  1. echo "<p>".(eval('return $'.$test.';'))."</p>";



Tu tiens vraiment à ce qu'il continue à écrire ce genre de code?[:delarue5]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 02-06-2008 à 15:22:15    

skeye a écrit :

Bon, on avance. Il te reste plus qu'à nous expliquer pour quelle raison saugrenue tu ne connais pas le nom de tes variables et on pourra t'expliquer quoi utiliser à la place.


 
Je ne connais pas le nom de mes variables car les xml que je parse ont une structure variable, j'ai donc plus ou moins de variables et a chaque fois que je les récupère dans un  
 
foreach($_POST as $nom_var=>$value) {
...
}

Reply

Marsh Posté le 02-06-2008 à 15:24:11    

babakill a écrit :

 

Je ne connais pas le nom de mes variables car les xml que je parse ont une structure variable


Et alors?[:pingouino]
Pour autant que je sache un xml peut être représenté sans aucune difficulté par un tableau ou un objet php...

Message cité 1 fois
Message édité par skeye le 02-06-2008 à 15:24:55

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 02-06-2008 à 15:36:29    

skeye a écrit :


Et alors?[:pingouino]
Pour autant que je sache un xml peut être représenté sans aucune difficulté par un tableau ou un objet php...


Oui mais je recois les nouvelles valeurs depuis un formulaire donc indépendement.
Pour m'y retrouver je génère des noms de variables implicite afin de m'y retrouver que je traite pour devenir :
 
racine->attribut[0], racine->attribut[1], racine->lien[0]->objet[0]->attribut[0] ...
 
maintenant j'aimerais affecter des nouvelles valeurs mais pas moyen de faire :
 
$test = "racine->lien[1]->objet[0]->attribut[0]";
$$test = "12345"
 
Mais je vois pas comment faire autrement ....
Le eval me permet l'affichage mais j'aimerais maintenant attribuer les nouvelles valeurs a mon xml.

Reply

Marsh Posté le 02-06-2008 à 15:40:31    

code de mon formulaire :
 
<input type=text name='attribut/1\' value='ALLOWIN'>
<input type=text name='attribut/0\' value='ALLOWIN'>
<input type=text name='lien/0\->objet/0\->attribut/0\' value='1234'>
<input type=text name='lien/1\->objet/0\->attribut/0\' value='3456'>
.....
 
Je traite la reception :
 
// On ouvre le fichier
$racine = simplexml_load_file("http://localhost/test.xml" );
echo "<p>".$racine->asXml()."</p>";
foreach($_POST as $nom_var=>$value) {
 
 //Traitement des noms de variables
 $nom_var_modif = str_replace("/", "[", $nom_var);
 $nom_var_modif = str_replace("\\", "]", $nom_var_modif);
 //$nom_var_modif = str_replace("&", " ", $nom_var_modif);
 //
 $nom_var_modif = "racine->".$nom_var_modif;
 $nom_var_modif = trim($nom_var_modif);
 
 echo '<p>'.$nom_var_modif.' = '.$value.'</p>';
 
 //$$nom_var_modif = $value; // Voici maintenant ce que j'aimerais reussir a faire
}

Reply

Marsh Posté le 02-06-2008 à 15:47:53    

skeye a écrit :

Tu tiens vraiment à ce qu'il continue à écrire ce genre de code?[:delarue5]


J'ai, il y a bien longtemps, abandonné tout espoir sur l'apprentissage des bonnes méthodes de programmation en php. Tout le monde lui explique que c'est pas une bonne idée, qu'en plus pour y arriver il faut utiliser des moyens détournés.

 

Si tout cela ne l'interpelle pas et qu'il choisit d'utiliser cet horreur c'est qu'on pouvait pas grand chose pour lui, alors autant qu'il utilise le eval [:spamafote]

 

edit:

babakill a écrit :

<input type=text name='attribut/1\' value='ALLOWIN'>
<input type=text name='attribut/0\' value='ALLOWIN'>
<input type=text name='lien/0\->objet/0\->attribut/0\' value='1234'>
<input type=text name='lien/1\->objet/0\->attribut/0\' value='3456'>


[:prozac]
tiens pour l'affectation tu peux utiliser:

Code :
  1. $test = "racine->lien[1]->objet[0]->attribut[0]";
  2. eval('$'.$test.' = 12345;');

Message cité 2 fois
Message édité par anapajari le 02-06-2008 à 15:50:42

---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 02-06-2008 à 15:50:49    

anapajari a écrit :


J'ai, il y a bien longtemps, abandonné tout espoir sur l'apprentissage des bonnes méthodes de programmation en php. Tout le monde lui explique que c'est pas une bonne idée, qu'en plus pour y arriver il faut utiliser des moyens détournés.
 
Si tout cela ne l'interpelle pas et qu'il choisit d'utiliser cet horreur c'est qu'on pouvait pas grand chose pour lui, alors autant qu'il utilise le eval [:spamafote]


 
Je suis bien entendu ouvert au bonnes méthodes mais pour l'instant je n'en vois pas de meilleur, alors ce genre de remarque me semble encore moins constructive !

Reply

Marsh Posté le 02-06-2008 à 15:54:09    

anapajari a écrit :


J'ai, il y a bien longtemps, abandonné tout espoir sur l'apprentissage des bonnes méthodes de programmation en php. Tout le monde lui explique que c'est pas une bonne idée, qu'en plus pour y arriver il faut utiliser des moyens détournés.
 
Si tout cela ne l'interpelle pas et qu'il choisit d'utiliser cet horreur c'est qu'on pouvait pas grand chose pour lui, alors autant qu'il utilise le eval [:spamafote]
 
edit:


 

anapajari a écrit :


[:prozac]
tiens pour l'affectation tu peux utiliser:

Code :
  1. $test = "racine->lien[1]->objet[0]->attribut[0]";
  2. eval('$'.$test.' = 12345;');



 
Merci beaucoup !

Reply

Marsh Posté le 02-06-2008 à 16:14:11    

babakill a écrit :


 
Je suis bien entendu ouvert au bonnes méthodes mais pour l'instant je n'en vois pas de meilleur, alors ce genre de remarque me semble encore moins constructive !


 
deja commencer par utiliser des tableaux directement dans les noms de variables
 
 
genre  
<input name="champ[249][]">
 
que tu vas récupérer dans $_POST['champ'][249]


---------------

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed