[Résolu] Nom d'une variable dépend d'une autre

Nom d'une variable dépend d'une autre [Résolu] - PHP - Programmation

Marsh Posté le 08-08-2010 à 20:46:03    

Bonjour,
Voila un morceau de code :

Code :
  1. while($donnee != "" )
  2. {
  3.     $resultat = mysql_query ( "SELECT * FROM donnees WHERE ID='$i'" );
  4.     $resultat_array = mysql_fetch_array ( $resultat );
  5.     $donnee = $resultat_array[Donnee];
  6.     $"$donnee" =$_POST["donnee"];
  7.     $i++;
  8. }


Donc voila ce morceau de code se charge de récupérer des donnée d'un formulaire d'inscription, ce formulaire est modifiable via une page d'administration donc il peut contenir plus ou moins de champs.  
J'ai donc une liste des champs dans une table sql donc par exemple au premier tour de la boucle le programme interroge la BDD qui lui dit qu'il y a un champ "Nom", la variable "$donnee" prend donc la valeur "Nom " et donc j'aimerais récuperer la valeur du champ "Nom" dans une variable $nom et c'est la où je bloque, là ou j'ai marquer "$"$donnee".


Message édité par Pommesky le 14-08-2010 à 21:13:53
Reply

Marsh Posté le 08-08-2010 à 20:46:03   

Reply

Marsh Posté le 08-08-2010 à 20:49:55    

pourquoi tu n'utilise pas des tableaux dans ton formulaire  ?  

Code :
  1. <input type="text" name="donnees[utilisateurs][]" >


 
ca te simplifierai ton traitement et ce sera bcp plus propre  
 
sinon, tu peux faire $$donne , tout simplement, mais c'est très sale

Reply

Marsh Posté le 09-08-2010 à 09:36:03    

flo850 a écrit :


 
sinon, tu peux faire $$donne , tout simplement, mais c'est très sale


 
Ah bon pourquoi?  
 
Sinonton code est dégeu Pommesky. Trop de pomme-sky sans doute. Ha. Ha.
 

  • $donnee = $resultat_array[Donnee]; <-- Donnee n'est initialisé nulle part
  • $"$donnee" =$_POST["donnee"]; <-- Tu récupères des variables POST dans une boucle while. Ca a rien à y faire.

Reply

Marsh Posté le 09-08-2010 à 09:37:39    

parceuqe ca rend le code illisible et indébugable , mais surtout parceque c'est une solution à un problème qui ne dois pas se poser, les tableaux sont là pour ça

 

et il faut bien qu'il traite les données dans la boucle, vu que c'est dans cette meme boucle qu'il connait le nom de la variable a récupérer


Message édité par flo850 le 09-08-2010 à 09:38:13
Reply

Marsh Posté le 09-08-2010 à 09:41:05    

Mais oui mais non, il récupère toujours la même valeur du post...  
Bon bref il y a sans doute deux couilles dans le potage en même temps, il voulait sans doute écrire:
 
$$donnee =$_POST[$donnee];

Reply

Marsh Posté le 09-08-2010 à 16:43:36    

Alors voilà j'ai trouvé la solution a mon problème
déjà :

Citation :

$donnee = $resultat_array[Donnee]; <-- Donnee n'est initialisé nulle part


"Donnee" c'est juste pour avoir le nom du champ dans lequel à été posté les données que je doit récupérer, les noms des champ sont stockés dans une table SQL et correspondent à un id qui est incrémenté a chaque boucle, ce qui me permet de traité les champs un par un.

Citation :

$"$donnee" =$_POST["donnee"]; <-- Tu récupères des variables POST dans une boucle while. Ca a rien à y faire.


Ce programme est un genre de mini cms, le formulaire d'inscription doit être flexible sans pour autant touché le code c'est pour ça que les nom de mes champs sont stocké dans une table sql et a part une boucle pour les récupérer je n'ai rien trouvé d'autre et je ne trouve pas que sa gène.
 
Bref donc j'ai remagné le pâté et voila ce que ça donne :

Code :
  1. function recuperer_donnee()
  2. {
  3.     $donnee [30];
  4.     $nom_du_champ = "xxx";
  5.     $i = 1;
  6.     while($nom_du_champ != "" )
  7.     {
  8.         $resultat = mysql_query ( "SELECT * FROM donnees WHERE ID='$i'" );
  9.         $resultat_array = mysql_fetch_array ( $resultat );
  10.         $nom_du_champ = $resultat_array[Donnee];
  11.         $donnee[$nom_du_champ]=$_POST["$nom_du_champ"];
  12.         $i++;
  13.     }
  14.     return $donnee;
  15. }


 
Je retourne donc un tableau et c'est bien plus pratique.
Merci pour tous vos conseils et n'hésiter pas si vous avez des remarques, c'est vrai que j'ai beaucoup de mal à faire un code lisible -_-

Reply

Marsh Posté le 09-08-2010 à 18:07:29    

On peut pinailler sur la meilleure façon de faire, mais ton code n'a plus de parties aberrantes. Merci du retour.

Reply

Marsh Posté le 09-08-2010 à 20:54:26    

gelatine_velue a écrit :

On peut pinailler sur la meilleure façon de faire, mais ton code n'a plus de parties aberrantes. Merci du retour.


 
si le $i, les id ne non pas forcement incrémenté, il peu y avoir des trous (voir même des gros)
 
sinon je comprend pas pourquoi faire une requête par id autant tout prendre et faire une condition sur la requête,
 
le plus simple c'est de faire un SHOW COLUMNS, et un array_merge avec ton POST

Reply

Marsh Posté le 14-08-2010 à 21:12:16    

Ça y est je suis finalement arrivé à un résultat qui me convient et propre, qui corrige le problème les $id puisque je ne les utilise plus. J'ai gouté aux joies des tableaux et sa va 15 fois mieux
Voilà le code :

Code :
  1. function recuperer_donnees()
  2. //Cette fonction récupère les données du formulaire d'inscription et les renvoient dans un tableau sous la forme $donnees[$nom_de_donnee]
  3. //La fonction connexion_sql doit est appelée avant d'utilisé celle-ci
  4. {
  5.     //Initialisation des variables
  6.     $donnees [30];
  7.     //Boucle pour insérer la colonne Nom_de_donnee de la bdd dans le tableau $tableau_noms_de_donnee
  8.     $resultat = mysql_query ( "SELECT Nom_de_donnee FROM profil" );
  9.     while ($resultat_array = mysql_fetch_array ( $resultat ))
  10.     {
  11.         $tableau_noms_de_donnee[] = $resultat_array[0];
  12.     }
  13.     //Boucle qui récupère les données du formulaire associés au noms de données stockés dans le tableau $tableau_noms_de_donnee
  14.     for($nb =0; $tableau_noms_de_donnee[$nb] != false; $nb++)
  15.     {
  16.         $nom_de_donnee = $tableau_noms_de_donnee[$nb];
  17.         $donnees[$nom_de_donnee]=$_POST["$nom_de_donnee"];
  18.     }
  19.     return $donnees;
  20. }


Merci pour vos remarques à tous, j'ai appris beaucoup de chose.


Message édité par Pommesky le 14-08-2010 à 21:12:48
Reply

Marsh Posté le 20-09-2010 à 15:07:44    

Personnellement je ne suis pas fan de la déclaration à coup de :

Code :
  1. $donnees [30];


Il vaut mieux initialiser une variable proprement.
D'autre part :

Code :
  1. for($nb =0; $tableau_noms_de_donnee[$nb] != false; $nb++)


Ce code va te faire une notice sur ta dernière itération, mieux vaudrait faire :

Code :
  1. foreach(array_keys($tableau_noms_de_donnee) as $nb)


Enfin, ce n'est pas méchant, mais las variables globales de type GET/POST n'ont pas vocation a être récupérées dans une fonction, mieux vaut les passer proprement en arguments.

Reply

Marsh Posté le 20-09-2010 à 15:07:44   

Reply

Marsh Posté le 20-09-2010 à 21:44:32    

the_bigboo a écrit :

Code :
  1. foreach(array_keys($tableau_noms_de_donnee) as $nb)


pourquoi array_keys ?

Code :
  1. foreach($tableau_noms_de_donnee as $key => $nb)

Reply

Marsh Posté le 21-09-2010 à 13:55:26    

stealth35 a écrit :

pourquoi array_keys ?

Code :
  1. foreach($tableau_noms_de_donnee as $key => $nb)



Parce que dans ta boucle, c'est $nb qui évolue et que tu incrémentes. $nb, qui est la clé de ton tableau.
Faire :

Code :
  1. for($nb =0; $tableau_noms_de_donnee[$nb] != false; $nb++)


C'est comme faire :

Code :
  1. foreach(array_keys($tableau_noms_de_donnee) as $nb)


Sauf que cette dernière notation est bien plus propre. Et elle n'utilise que les clé définies dans ton tableau, à l'instar de ta méthode, qui va les tester une à une.

Message cité 1 fois
Message édité par the_bigboo le 21-09-2010 à 13:58:44
Reply

Marsh Posté le 21-09-2010 à 14:09:21    

Code :
  1. foreach($tableau_noms_de_donnee as $nom_de_donnee)
  2. {
  3.    $donnees[$nom_de_donnee] = $_POST["$nom_de_donnee"];
  4. }
 

:??:

 

et pourquoi pas directement dans le while :??:

 
Code :
  1. while ($resultat_array = mysql_fetch_array ( $resultat ))
  2. {
  3.    $nom_de_donnee = $resultat_array[0];
  4.    $donnees[$nom_de_donnee] = $_POST["$nom_de_donnee"];
  5. }


Message édité par art_dupond le 21-09-2010 à 14:12:47

---------------
oui oui
Reply

Marsh Posté le 21-09-2010 à 14:13:28    

Code :
  1. $_POST["$nom_de_donnee"];


Décidément j'aime pas cette notation.... la variable dans une string bof...
Après il fait ce qu'il veux, j'essaie juste de montrer comment faire des boucles correctes.

Message cité 1 fois
Message édité par the_bigboo le 21-09-2010 à 14:15:10
Reply

Marsh Posté le 21-09-2010 à 14:15:39    

qu'est-ce qui est vague ?  
 
pourquoi récupérer les clés pour récupérer les valeurs depuis les clés récupérées :pt1cable:  
 
mais avant ça, pourquoi ne pas remplir $données directement au lieu de passer par un tableau intermédiaire ?


---------------
oui oui
Reply

Marsh Posté le 21-09-2010 à 14:18:30    

the_bigboo a écrit :

Code :
  1. $_POST["$nom_de_donnee"];


Décidément j'aime pas cette notation.... la variable dans une string bof...
Après il fait ce qu'il veux, j'essaie juste de montrer comment faire des boucles correctes.

 

c'est pas en changeant son for par ton foreach que c'est plus "correct" à ce niveau là :o


Message édité par art_dupond le 21-09-2010 à 14:18:35

---------------
oui oui
Reply

Marsh Posté le 21-09-2010 à 14:19:22    

C'est juste son "for" qui est très moche c'est tout.

Reply

Marsh Posté le 21-09-2010 à 14:21:26    

the_bigboo a écrit :

C'est juste son "for" qui est très moche c'est tout.


et le tiens est tordu :p

Spoiler :

mais j'ai bien compris que c'était pour s'adapter à son code :jap:


 


---------------
oui oui
Reply

Marsh Posté le 21-09-2010 à 14:30:28    

J'ai cru un instant que ce n'était pas le cas, je suis donc rassuré ^^
Ca fait longtemps que je n'ai pas directement utilisé ces fonctions là... Tout passe par des class d'abstraction de BDD ^^

Reply

Marsh Posté le 21-09-2010 à 18:49:27    

the_bigboo a écrit :


C'est comme faire :

Code :
  1. foreach(array_keys($tableau_noms_de_donnee) as $nb)


Sauf que cette dernière notation est bien plus propre. Et elle n'utilise que les clé définies dans ton tableau, à l'instar de ta méthode, qui va les tester une à une.


tester quoi ?


Message édité par stealth35 le 21-09-2010 à 18:49:34
Reply

Marsh Posté le 21-09-2010 à 20:25:18    

chaque itération de la boucle... !
Dans son code il fait :

Code :
  1. for($nb =0; $tableau_noms_de_donnee[$nb] != false; $nb++)


Si son tableau est (c'est qu'un exemple bidon hein !) :

Code :
  1. $tableau_noms_de_donnee = array(128=>array(/*... some data ...*/))


Sa boucle fera 127 itération inutiles avant d'en avoir une exploitable, alors que dans cette boucle-ci :

Code :
  1. foreach(array_keys($tableau_noms_de_donnee) as $nb)


... tu ne parcourras que les données présentes dans le tableau soit une boucle par donnée (for each quoi !)

Reply

Marsh Posté le 21-09-2010 à 20:40:27    

y'a pas de test quand on fait ca :

Code :
  1. foreach($tableau_noms_de_donnee as $nb => $value)


Message édité par stealth35 le 21-09-2010 à 20:42:14
Reply

Marsh Posté le 21-09-2010 à 21:17:25    

Tu as compris mon message ?  :heink:

Reply

Marsh Posté le 21-09-2010 à 21:29:14    

the_bigboo a écrit :

Tu as compris mon message ?  :heink:


je pense que t'as pas compris le mien
 
pour toi c'est quoi la différence entre

Code :
  1. foreach(array_keys($tableau_noms_de_donnee) as $nb)

et

Code :
  1. foreach($tableau_noms_de_donnee as $nb => $value)

a part faire une fonction pour rien ?

Reply

Marsh Posté le 21-09-2010 à 21:32:48    

j'ai adapté à son exemple, il n'utilisait que la clé du tableau dans son bout de code, sauf erreur de ma part.

Reply

Marsh Posté le 21-09-2010 à 21:48:11    

the_bigboo a écrit :

j'ai adapté à son exemple, il n'utilisait que la clé du tableau dans son bout de code, sauf erreur de ma part.

 

c'est la phrase la que je comprend pas :

 

Et elle n'utilise que les clé définies dans ton tableau, à l'instar de ta méthode, qui va les tester une à une.

 

donc :

stealth35 a écrit :


pour toi c'est quoi la différence entre

Code :
  1. foreach(array_keys($tableau_noms_de_donnee) as $nb)

et

Code :
  1. foreach($tableau_noms_de_donnee as $nb => $value)

a part faire une fonction pour rien ?



Message édité par stealth35 le 21-09-2010 à 21:49:15
Reply

Marsh Posté le 21-09-2010 à 22:09:54    

Et elle n'utilise que les clé définies dans ton tableau,
=> le foreach se base sur ce qui se trouve dans le tableau pour boucler
 
 à l'instar de ta méthode, qui va les tester une à une.
 => le for testera toutes les valeurs de $nb une a une séquentiellement
 
Ce que je compare, c'est sa boucle for par rapport a ces foreach :

Code :
  1. foreach(array_keys($tableau_noms_de_donnee) as $nb)
  2. //OU
  3. foreach($tableau_noms_de_donnee as $nb => $value)

Reply

Marsh Posté le 21-09-2010 à 22:15:41    

the_bigboo a écrit :


 à l'instar de ta méthode, qui va les tester une à une.
 => le for testera toutes les valeurs de $nb une a une séquentiellement


tu le vois ou le for ?, dans  

Code :
  1. foreach($tableau_noms_de_donnee as $nb => $value)

:pt1cable:

Reply

Marsh Posté le 21-09-2010 à 22:18:29    

Ligne 16 de son troisième bout de code posté, que j'ai d'ailleurs repris en citation dans mon comparaison...

Reply

Marsh Posté le 21-09-2010 à 22:28:03    

the_bigboo a écrit :

Ligne 16 de son troisième bout de code posté, que j'ai d'ailleurs repris en citation dans mon comparaison...


donc c'est pas ta méthode mais ça méthode, relis les 2 messages
http://forum.hardware.fr/hfr/Progr [...] m#t2023996
 ;)  

Reply

Marsh Posté le 21-09-2010 à 22:33:35    

sa méthode est le for, ma méthode est le foreach... je dois vraiment pas écrire français.
 
Bref, débat clos.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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